UVa——110502 Reverse and Add(数论)
题意:从某个数开始,先将它每一位数的顺序颠倒过来,然后把这个数和原数相加。如果和不是一个回文,就重复这一操作,直到它变成一个回文数。输出得到的回文数所需的最少加法次数以及得到的回文数。(回文数不超过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;
}