思路:
第一眼以为是个简单的字符串转数字相加就可以,但是数字最多可能有1000位,常规的long long 都无法存下,这里就需要转换成字符串处理相加
1.ispalindrome函数判断是否是一个回文字符串,是则返回true
2.getsum需要一个参数a,计算a加上a的反转数字,并返回结果
3.剩下的看注释即可,题目不难,但是要考虑的细节很多
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
bool ispalindrome(string a)
{
string left=a.substr(0,a.size()/2);//左边部分
string right;//右边部分
if(a.size()%2==0)//能被2整除
{
right=a.substr(a.size()/2,a.size());
}
else
{
right=a.substr(a.size()/2+1,a.size());
}
reverse(right.begin(),right.end());
if(left==right)return true;
else return false;
}
string getreverse(string a)
{
reverse(a.begin(),a.end());
return a;
}
string getsum(string a)
{
string str1=a,str2,str3;
str2=getreverse(str1);
int pre=0,sum;//进位值
str3.resize(str1.size()+1);//假设运算结果比原来多一位
for(int i=str1.size()-1;i>=0;i--)
{
char x=str1[i],y=str2[i];
sum=pre+x-'0'+y-'0';
str3[i+1]=sum%10+'0';
if(sum>=10)
{
pre=1;
}
else pre=0;
}
if(pre>0)str3[0]=pre+'0';//最高位有进位
else str3.erase(str3.begin());//没进位,删除第一个元素
return str3;
}
int main()
{
string a,b,c;
cin>>a;
int cnt=10;//剩余计算次数
while(!ispalindrome(a)&&cnt--)
{
cout<<a<<" + "<<getreverse(a)<<" = "<<getsum(a)<<endl;
a=getsum(a);
}
if(cnt>0)cout<<a<<" is a palindromic number."<<endl;
else cout<<"Not found in 10 iterations."<<endl;
return 0;
}