#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循环写得思路更清晰,只需操作两个结构体即可.