回文数?回文数!

题目来源:
题目描述:

若一个数(首位不为0)从左向右读与从右向左读都一样,就将其称为回文数。例如:1,2,3…11011,111,4884…就是一些回文数。HSY学长在学习了一些数学知识后认为所有的数在经过有限次数的相加可以使一个数变成回文数,例如56 +65=121 在经过1次变换后得到的是121就是一个回文数。现在HSY学长有个小问题:给出一个十进制数n,问经过多少次改变才能将其变成一个回文数?并将其每一步的运算结果输出来,由于HSY学长比较懒,所以当转换次数超过30次还没有转换成回文数的他都认为这个数不能转换成功。

输入描述:

T组输入,每一行的第一个数为一个整数T(0<T<=25),代表有T组数据,接下来一个整数n(n的位数为不大于1000位的正整数),代表HSY学长要判断的数。

输出描述:

对于每个测试用例,第一行输出“Case#: ”,#表示测试用例的编号。然后如果这个数本身就是一个回文数,那么你要输出“The number itself is palindrome!”,如果这个数转换超过30次,你就输出"This number has been converted more than 30 times!",(均没有引号),否则你应该输出m+1行,第一行输出一个数m,表示经过了m次变换,接下来m行表示每步的变换过程。注意在两个测试用例之间输出一个空行!

样例输入:

4
1
56
87
803998362

样例输出:

Case 1:
The number itself is palindrome!

Case 2:
This number has been transformed into palindrome 1 times!
STEP 1 : 56 + 65 = 121

Case 3:
This number has been transformed into palindrome 4 times!
STEP 1 : 87 + 78 = 165
STEP 2 : 165 + 561 = 726
STEP 3 : 726 + 627 = 1353
STEP 4 : 1353 + 3531 = 4884

Case 4:
This number has been converted more than 30 times!

提示:

注意在两个测试用例之间输出一个空行!

思路:直接模拟(前导零得去掉,答案可以用二维数组存)
代码:

#include<cstdio>
#include<cstring>
char ss[55][1500],c[55][1500];
int t,len,sum[1500];
void intt()
{
        memset(ss,0,sizeof(ss));
        memset(c,0,sizeof(c));
}
int main()
{
    scanf("%d",&t);
    int k=0;
    while(t--)
    {
        if(k!=0)
            printf("\n");
        int num=0;
        k++;
        scanf("%s",ss[0]);
        printf("Case %d:\n",k);
        len=strlen(ss[0]);
        while(num<=30)
        {
            memset(sum,0,sizeof(sum));
            int flag=0;
            for(int i=0,j=len-1; i<j; i++,j--)
                if(ss[num][i]!=ss[num][j])
                    flag=1;
            if(flag==1)
            {
                num++;
                int s=0;
                for(int i=len-1; i>=0; i--)
                {
                    c[num-1][s]=ss[num-1][i];
                    s++;
                }
                for(int i=0; i<len; i++)
                {
                    sum[i]+=ss[num-1][i]-'0'+c[num-1][i]-'0';
                    if(sum[i]>9)
                    {
                        sum[i]%=10;
                        sum[i+1]=1;
                    }
                }
                int m=len;
                for(int i=0; i<m; i++)
                {
                    if(c[num-1][0]=='0')
                    {
                        for(int i=0; i<m; i++)
                            c[num-1][i]=c[num-1][i+1];
                        m--;
                        i--;
                    }
                }
                c[num-1][m]='\0';
                while(sum[len]==0)
                    len--;
                int p=0;
                for(int i=len; i>=0; i--)
                {
                    ss[num][p]=sum[i]+48;
                    p++;
                }
                ss[len][p]='\0';
                len=p;
            }
            if(flag==0)
                break;
        }
        if(num==0)
            printf("The number itself is palindrome!\n");
        else if(num>0&&num<30)
        {
            printf("This number has been transformed into palindrome %d times!\n",num);
            for(int i=1; i<=num; i++)
                printf("STEP %d : %s + %s = %s\n",i,ss[i-1],c[i-1],ss[i]);
        }
        else
            printf("This number has been converted more than 30 times!\n");
            intt();
    }
    return 0;
}