pat-1136. A Delayed Palindrome (20) 模拟

来源:互联网 发布:直播软件类似yy 编辑:程序博客网 时间:2024/05/21 07:55

本可以java大数就能搞定的问题
当时用java写完答案明明对了提交总是答案错误
很是无语

题意

任给我们一个数
让我们对这个数进行翻转相加
如果加和是个回文数 就找到了程序出口
如果不是继续迭代
输出过程 如果迭代10次没有找到就输出特定信息

分析

就是模拟高精度加法
场上没想清楚为什么要那么加
两个数相加只可能比原数多进一位
完全可以用正序和逆序两个数组里一加
不必管 低位高位 对齐的情况
因为是一个数与自己的逆序相加 所以一定位数相同且从低位加还是从高位加结果相同
如果是不同数的加法或是乘法
我们需要从两个数的最高位置 向低位运算 因为高位为原数据的低位
所以最后再反向输出

code

#include<bits/stdc++.h>using namespace std;char a[1010],b[1010];bool check(char aa[]){    int len = strlen(aa);    for(int i=0;i<len-1-i;i++){        if(aa[i]!=aa[len-1-i])return 0;    }    return 1;}//回文检验int main(){    gets(a);    bool f=0;    int c=0;    while(!check(a)){        if( c==10 ){            printf("Not found in 10 iterations.");            f=1;            break;        }        int lena = strlen(a)-1,tag=0;        for(int i=lena;i>=0;i--){            b[tag++] = a[i];        }//将原数逆序         b[tag] = '\0';        printf("%s + %s",a,b);        int i,y = 0;        for(i=0;i<=lena;i++){//模拟加法            int dig = (a[i]-'0')+(b[i]-'0')+y;            a[i] = '0'+dig%10;            if(dig>9)y=1;            else y = 0;        }        if(y)a[i] = '0'+y,a[++i] = '\0';//余数处理        else a[i] = '\0';//行尾结束控制        i--;//找回重点        for(int j=0;j<i-j;j++){//把顺序换回来            swap(a[j],a[i-j]);        }               printf(" = %s\n",a);        c++;    }    if(!f)printf("%s is a palindromic number.",a);    return 0;}