一开始看到题目还挺高兴的,因为想着用string库里的reverse和stoi能很快解决问题,做完后才发现最后一个测试点出现运行时错误,后来想了下,输入的数N的大小可以很大,超过int能保存的数值,会出现数组越界的情况,所以应该改成用string字符串完成加法操作。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int main(){
string first;
cin>>first;
string ans;
bool flag=false;
string x=first;
reverse(x.begin(),x.end());
if(first==x){
cout<<first<<" is a palindromic number."<<endl;
return 0;
}
for(int i=0;i<10;i++){
string second=first;
reverse(second.begin(),second.end());
string res=to_string(stoi(first)+stoi(second));//就这个地方,N过大的时候,会出现数组越界
cout<<first<<" + "<<second<<" = "<<res<<endl;
string tmp=res;
reverse(tmp.begin(),tmp.end());
if(res==tmp){
ans=tmp;
flag=true;
break;
}
first=res;
}
if(flag)cout<<ans<<" is a palindromic number."<<endl;
else cout<<"Not found in 10 iterations."<<endl;
return 0;
}
将string求和的操作改为:
string get_sum(string s1,string s2){
string s=s1;
int carry=0;
for(int i=s1.size()-1;i>=0;i--){
s[i]=(s1[i]-'0'+s2[i]-'0'+carry)%10+'0';
carry=(s1[i]-'0'+s2[i]-'0'+carry)/10;
}
if(carry>0)return "1"+s;
else return s;
}
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
string get_sum(string s1,string s2){
string s=s1;
int carry=0;
for(int i=s1.size()-1;i>=0;i--){
s[i]=(s1[i]-'0'+s2[i]-'0'+carry)%10+'0';
carry=(s1[i]-'0'+s2[i]-'0'+carry)/10;
}
if(carry>0)return "1"+s;
else return s;
}
int main(){
string first;
cin>>first;
string ans;
bool flag=false;
string x=first;
reverse(x.begin(),x.end());
if(first==x){
cout<<first<<" is a palindromic number."<<endl;
return 0;
}
for(int i=0;i<10;i++){
string second=first;
reverse(second.begin(),second.end());
string res=get_sum(first,second);
cout<<first<<" + "<<second<<" = "<<res<<endl;
string tmp=res;
reverse(tmp.begin(),tmp.end());
if(res==tmp){
ans=tmp;
flag=true;
break;
}
first=res;
}
if(flag)cout<<ans<<" is a palindromic number."<<endl;
else cout<<"Not found in 10 iterations."<<endl;
return 0;
}