题意:
输入两个正整数N和K(N<=1e10,k<=100),求K次内N和N的反置相加能否得到一个回文数,输出这个数和最小的操作次数。
trick:
1e10的数字相加100次可能达到1e40,所以long long会爆,采用字符数组操作,以及代码注释中遇到的一些小问题。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 char num[107]; 5 char s[107];//这里用string的时候会遇到以下的小问题,查阅资料后发现直接对string原有长度以后的位置赋值不能增加它的长度,建议采用s+=" xxx",的形式可以增加string的长度。 6 int k; 7 int main(){ 8 cin>>s>>k; 9 int tot=k; 10 int flag=0; 11 int siz=strlen(s); 12 while(k--){ 13 memset(num,0,sizeof(num)); 14 int cnt=0; 15 for(int i=siz-1;i>=0;--i) 16 num[++cnt]=s[i]; 17 flag=0; 18 for(int i=1;i<=cnt/2;++i) 19 if(num[i]!=num[cnt-i+1]){ 20 flag=1; 21 break; 22 } 23 if(!flag){ 24 flag=2; 25 break; 26 } 27 string y; 28 int jinwei=0; 29 for(int i=cnt;i;--i){ 30 int tt=num[i]+s[i-1]-'0'-'0'+jinwei; 31 y[i]=tt%10+'0'; 32 jinwei=tt/10; 33 } 34 if(jinwei) 35 y[0]='1'; 36 if(y[0]!=0) 37 for(int i=0;i<=cnt;++i) 38 s[i]=y[i]; 39 else 40 for(int i=1;i<=cnt;++i) 41 s[i-1]=y[i]; 42 if(s[cnt]!=0) 43 siz=cnt+1;//这里用siz来更新s的长度会在使用string s的时候出现段错误 44 else 45 siz=cnt;//这里如果不用siz来更新s的长度会在使用string s的时候s.size()不更新,依然是输入s的时候的size(),不是很懂,在size()-1以后的位置给s赋值,不能更新它的size(),用siz更新也会出现段错误 46 } 47 for(int i=0;i<siz;++i) 48 cout<<s[i]; 49 cout<<endl; 50 if(flag==2) 51 cout<<tot-k-1; 52 else 53 cout<<tot; 54 return 0; 55 }