题意:回文字,对输入数值进行判断,若不是回文,则反转相加继续。
分析:数值1010,再迭代相加100次,大概达到1040级;long long型也不足以表示,需要使用字符型处理。使用字符串的转化为大数数组处理。
注意:大数运算是唯一long long也无法处理的数据大小,结果输出处需要迭代输出
#include<cstdio>
#include<string.h>
using namespace std;
const int N =1000;//最大位数
struct bign{
int value[N];
int len;
bign(){
memset(value,0,sizeof(value));
len = 0;
}
};
bign change(char s[]){
bign a;
a.len = strlen(s);
for(int i=0;i<a.len;i++){
a.value[i] = s[a.len-1-i]-'0';//逆序存储
}
return a;
}
bool ispal(bign a){
for(int i=0;i<=(int)(a.len/2);i++){//取了是因为a.len = 1的情况
if(a.value[i] != a.value[a.len-1-i]) return false;
}
return true;
}
bign add(bign a){
bign b;
int temp=0;//进位
b.len = a.len;
for(int i=0;i < b.len;i++){
temp += a.value[i]+a.value[a.len-1-i];
b.value[i] = temp%10;//余数为该位的值
temp /= 10;//进位
}
if(temp!=0){//仍有进位
b.value[b.len] = temp;
b.len++;
}
return b;
}
int main(){
char s[N];
int k;
scanf("%s %d",s,&k);
bign a = change(s);
int c = 0;
for(int i = 0; i < k ; i++){//处理c次,c<=k
if(ispal(a) == true)
break;
else{
a = add(a);
c++;
}
}
for(int j=0;j<a.len;j++){
printf("%d",a.value[a.len-1-j]);
}
printf("
");
printf("%d",c);
return 0;
}