大整数加法
最开始我以为long long就足够了,结果提交的时候有两个测试点没通过,紧接着我考虑用大整数加法,但是第一遍提交还是错了,我以为代码写错了,后来发现是数组开小了。
#include<cstdio>
int arr[200],b[200];
long long n,K;
bool check(int k){
for(int j=0;j<=k/2;j++){
if(arr[j]!=arr[k-1-j]) return false;
}
return true;
}
void pal(long long x){
int k=0;
do{ //先转换为数组 存的结果也为逆序678 存为876
arr[k++]=x%10;
x=x/10;
}while(x!=0);
int cnt=0;
while(!check(k) && cnt < K){
cnt++;
int c=0;
for(int j=0;j<k;j++){ //正序和逆序相加 大整数加法是先反转后相加,相加后再反转
int tmp=arr[j]+arr[k-1-j] + c;
c = tmp / 10;
b[j] = tmp % 10;
}
if(c==1) b[k++]=1; //最后有进位的情况
for(int j=k-1;j>=0;j--){ //反转元素
arr[k-1-j]=b[j];
}
}
for(int j=0;j<k;j++){
printf("%d",arr[j]);
}
printf("\n%d",cnt);
}
int main(){
scanf("%lld%lld",&n,&K);
pal(n);
return 0;
}
版本2
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
string add(string rev){
string res, org = rev;
reverse(rev.begin(), rev.end());
int c = 0;
for(int i = 0; i < org.size(); i++){
int a = org[i] - '0';
int b = rev[i] - '0';
int t = a + b + c;
res += to_string(t % 10);
c = t / 10;
}
if(c != 0) res += '1';
reverse(res.begin(), res.end());
return res;
}
int main(){
int k;
string s, res, t;
cin>>s>>k;
for(int i = 1; i <= k; i++){
res = add(s);
t = res;
reverse(res.begin(), res.end());
if(t == res){
cout<<t<<endl;
cout<<i<<endl;
return 0;
}
s = t;
}
cout<<s<<endl;
cout<<k<<endl;
return 0;
}