题意:从某个数开始,先将它每一位数的顺序颠倒过来,然后把这个数和原数相加。如果和不是一个回文,就重复这一操作,直到它变成一个回文数。输出得到的回文数所需的最少加法次数以及得到的回文数。(回文数不超过4 294 967 295)
解题思路:由于回文数超过整型范围,所以用数组 a[] 存储这个数,而用数组 b[] 存储字符数组 a 的逆序串。然后进行大数相加(注意进位),把结果保存在数组 a 中,不断进行更新,直到 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== 0) break;
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;
}
#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== 0) break;
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;
}