Description
一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。
任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。
例如:
68变成154(68+86),再变成605(154+451),最后变成1111(605+506),而1111是回文数。
于是有数学家提出一个猜想:
不论开始是什么正整数,在经过有限次正序数和倒序数相加的步骤后,都会得到一个回文数。至今为止还不知道这个猜想是对还是错。
现在请你编程序验证之。
Input
每行一个正整数。
Output
对应每个输入,输出一行为变换的过程。
Sample Input
27228
37649
37649
Sample Output
27228--->109500--->115401--->219912
37649--->132322--->355553
37649--->132322--->355553
Hint
1.输入的数据保证小于2^60
2.每组数据保证最多运算100次
友情提示:WA的同学请仔细阅读提示1和提示2
2.每组数据保证最多运算100次
友情提示:WA的同学请仔细阅读提示1和提示2
简单题解:看到提示,就直接用字符串处理大数加法,直接AC
#include<iostream>
#include<string>
using namespace std; bool ishuiwen(string s)
{
for(int i=;i<s.length()/;i++)
{
if(s[i]!=s[s.length()--i])
return ;
}
return ;
} string Add(string s)
{
string sum,x;
for(int i=;i<s.length();i++)
x[i]=s[s.length()-i-];
int len=s.length();
int *a=new int[len+];
a[]=;
int d=;
for(int i=s.length();i>=;i--)//从最低位开始计算两个数各位的和,保存到结果数组
a[i]=s[i-]+x[i-]-''-'';//a[1]为计算后结果的最高位,进位情况还未处理
for(int i=s.length();i>=;i--)//处理进位情况
{
a[i]+=d;//本位加上上一位的进位
if(a[i]>=)//当该位大于等于10时,只保留该位的个位 ,向下一位的进位d为十位
{
d=a[i]/;
a[i]%=;
}
else if(a[i]<)//当该位小于10是,向高位的进位为0
d=;
}
if(a[]>)
for(int i=;i<s.length()+;i++)
sum+=a[i]+'';
else
for(int i=;i<s.length();i++)
sum+=a[i+]+'';
return sum;
} int main()
{
string s;
while(cin>>s)
{
cout<<s;
while(!ishuiwen(s))
{
s=Add(s);
cout<<"--->"<<s;
}
cout<<endl;
}
return ;
}