UVa——110502 Reverse and Add(数论)

题意:从某个数开始,先将它每一位数的顺序颠倒过来,然后把这个数和原数相加。如果和不是一个回文,就重复这一操作,直到它变成一个回文数。输出得到的回文数所需的最少加法次数以及得到的回文数。(回文数不超过4 294 967 295

解题思路:由于回文数超过整型范围,所以用数组 a[] 存储这个数,而用数组 b[] 存储字符数组的逆序串。然后进行大数相加(注意进位),把结果保存在数组 a 中,不断进行更新,直到 中存放的是一个回文数。 

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
    int n,i,len,k,d;
    char a[15],b[15];
    cin>>n;
    while(n--)
    {
        cin>>a;
        len=strlen(a);
        int flag=1,sum=0;
        while(flag)
        {
            for(i=0;i<len;i++)
                if(a[i]!=a[len-1-i])
                {
                    flag=1; sum++; break;
                }
            else flag=0
            if(flag==0break;
            for(i=0;i<len;i++)
                b[i]=a[len-1-i];
            k=0;
            for(i=0;i<len-1;i++)
            {
                d=a[i]-'0'+b[i]-'0'+k;
                if(d>9) { k=1; d=d%10;}
                else  k=0
                a[i]=d+'0';
            }
            d=a[i]-'0'+b[i]-'0'+k;
            if(d>9){ 
                len++; d=d%10;
                a[i]=d+'0';
                a[i+1]=1+'0';
                a[i+2]='\0';
            }
            else a[i]=d+'0';
        }
        cout<<sum<<' '<<a<<endl;
    }
    return 0;
}

 

posted @ 2012-03-10 21:09  笑巧  阅读(200)  评论(0编辑  收藏  举报