#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
struct node{
int d[100]; //一開始數組下標範圍給小了,只給了25,導致兩個大數的測試點過不了,題目給定K<=100,因此遇到極端情況會超數組.
int len;
node(){
memset(d,0,sizeof(d));
len=0;
}
};
int k=0; //操作次數
bool judgePal(node res){ //判斷迴文
int len=res.len;
for(int i=0;i<len/2;i++){
if(res.d[i]!=res.d[len-i-1])return false;
}
return true;
}
node change(char n[12],int len){ //字符數組賦至結構體
node ori;
for(int i=len-1;i>=0;i--){
ori.d[len-i-1]=n[i]-'0';
}
ori.len=len;
return ori;
}
node reverseNode(node ori){ //反轉
node now;
int len=ori.len;
for(int i=len-1;i>=0;i--){
now.d[len-i-1]=ori.d[i];
}
return now;
}
node addNode(node ori,node now){ //大整數加法
node res;
int carry=0,len=ori.len,i;
for(i=0;i<len;i++){
int temp=carry+ori.d[i]+now.d[i];
res.d[i]=temp%10;
carry=temp/10;
}
if(carry!=0){
res.d[i]=carry;
res.len=i+1;
}else{
res.len=i;
}
return res;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
char n[12];
int K,len;
scanf("%s %d",n,&K);
len=strlen(n);
node ori=change(n,len);
node res=ori,now;
while(1){
if(judgePal(res)){ //可改成ori,去掉res
break;
}
if(k>=K){
break;
}
now=reverseNode(ori);
res=addNode(ori,now); //可改成ori,去掉res
ori=res;
k++;
}
for(int i=res.len-1;i>=0;i--){
printf("%d",res.d[i]);
}
printf("\n%d",k);
return 0;
}
algorithm中有現成的reverse函數,不用自己寫.
算法筆記中的while循環寫得思路更清晰,只需操作兩個結構體即可.