题目链接
注意点:如果操作步骤上限是100,操作100次以后早就超出long long的表示范围,因此必须使用大整数的结构体。
#include<cstdio>
#include<cstring>
struct bign{//大整数结构体
int d[1000],len;
bign(){
memset(d,0,sizeof(d));
len=0;
}
};
bign change(char str[]){
//将以字符串形式输入的大整数转化为bign类型
bign res;
res.len=strlen(str);
for(int i=0;i<res.len;i++){
res.d[i]=str[res.len-1-i]-'0';
}
return res;
}
bign add(bign a,bign b){//大整数相加
bign c;
int carry=0;//进位
for(int i=0;i<a.len||i<b.len;i++){
c.d[c.len++]=(a.d[i]+b.d[i]+carry)%10;
carry=(a.d[i]+b.d[i]+carry)/10;
}
if(carry) c.d[c.len++]=carry;//最高位进位
return c;
}
bign reverse(bign a){//反转
for(int i=0;i<a.len/2;i++){
//注意i的上限不能超过总长度的一半,否则中间的元素反转两次等于不变
int t=a.d[i];
a.d[i]=a.d[a.len-1-i];
a.d[a.len-1-i]=t;
}
return a;
}
void prit(bign a){//输出大整数
for(int i=a.len-1;i>=0;i--){
printf("%d",a.d[i]);
}
}
bool judge(bign a){//判断是否回文
for(int i=0;i<a.len/2;i++){
if(a.d[i]!=a.d[a.len-1-i]) return false;
}
return true;
}
int main(){
char n[1000];
int i,k;
scanf("%s %d",n,&k);//输入题目给的参数
bign num=change(n);
for(i=0;i<k;i++){
if(judge(num)) {//如果回文
prit(num);
printf("\n%d",i);//输出当前的步骤数
return 0;
}
else{//否则反转后相加
bign num1=reverse(num);
num=add(num,num1);
}
}
if(i==k){//到达操作步骤上限
prit(num);
printf("\n%d",k);
}
return 0;
}