题意:
输入两个正整数N和K(N<=1e10,k<=100),求K次内N和N的反置相加能否得到一个回文数,输出这个数和最小的操作次数。
trick:
1e10的数字相加100次可能达到1e40,所以long long会爆,采用字符数组操作,以及代码注释中遇到的一些小问题。
代码:
#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
char num[107];
char s[107];//这里用string的时候会遇到以下的小问题,查阅资料后发现直接对string原有长度以后的位置赋值不能增加它的长度,建议采用s+=" xxx",的形式可以增加string的长度。
int k;
int main(){
cin>>s>>k;
int tot=k;
int flag=0;
int siz=strlen(s);
while(k--){
memset(num,0,sizeof(num));
int cnt=0;
for(int i=siz-1;i>=0;--i)
num[++cnt]=s[i];
flag=0;
for(int i=1;i<=cnt/2;++i)
if(num[i]!=num[cnt-i+1]){
flag=1;
break;
}
if(!flag){
flag=2;
break;
}
string y;
int jinwei=0;
for(int i=cnt;i;--i){
int tt=num[i]+s[i-1]-‘0‘-‘0‘+jinwei;
y[i]=tt%10+‘0‘;
jinwei=tt/10;
}
if(jinwei)
y[0]=‘1‘;
if(y[0]!=0)
for(int i=0;i<=cnt;++i)
s[i]=y[i];
else
for(int i=1;i<=cnt;++i)
s[i-1]=y[i];
if(s[cnt]!=0)
siz=cnt+1;//这里用siz来更新s的长度会在使用string s的时候出现段错误
else
siz=cnt;//这里如果不用siz来更新s的长度会在使用string s的时候s.size()不更新,依然是输入s的时候的size(),不是很懂,在size()-1以后的位置给s赋值,不能更新它的size(),用siz更新也会出现段错误
}
for(int i=0;i<siz;++i)
cout<<s[i];
cout<<endl;
if(flag==2)
cout<<tot-k-1;
else
cout<<tot;
return 0;
}
原文地址:https://www.cnblogs.com/ldudxy/p/11442958.html