7-19 神奇的数学之回文数 (10 分)
回文数是一种数字。如:8008, 这个数字正读是8008,倒读也是8008,正读倒读一样,所以这个数字就是回文数。任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。例如:68变成154(68+86),再变成605(154+451),最后变成1111(605+506),而1111是回文数。于是有数学家提出一个猜想:不论开始是什么正整数,在经过有限次正序数和倒序数相加的步骤后,都会得到一个回文数。现在请你编程序验证猜想
输入格式:
每行一个正整数。
特别说明:输入的数据保证中间结果小于2^31
输出格式:
对应每个输入,输出两行,一行是变换的次数,一行是变换的过程。
输入样例:
27228
37649
输出样例:
在这里给出相应的输出。例如:
3
27228--->109500--->115401--->219912
2
37649--->132322--->355553
#include<stdio.h>
#include<string.h>
char* Dashuxiangjia(char *a1,char *a2);//大数相加
int panduanhuiwenshu(char *a);//判断回文数
char* reverse(char *a);//将数据反转
int main(){
char a1[1000]={'\0'},*a2,a3[1001]={'\0'},*temp,result[2000]={'\0'};
char s[4]="--->";
int i,n=3,k,len,count;
while(scanf("%s",a1)!=EOF){
count=0;
temp=a1;
for(k=0;k<strlen(a1);k++){
result[k]=a1[k];
}
while(panduanhuiwenshu(temp)!=1){
a2=reverse(temp);
temp=Dashuxiangjia(temp,a2);
len=strlen(temp);
for(i=0;i<4;i++,k++)
result[k]=s[i];
for(i=0;i<len;i++,k++)
result[k]=temp[i];
count++;
strcpy(a3,temp);
temp=a3;
}
printf("%d\n",count);
printf("%s\n",result);
memset(a1,'\0',sizeof(a1));
memset(result,'\0',sizeof(result));
}
return 0;
}
char* Dashuxiangjia(char *a1,char *a2){
int len1=strlen(a1);
int len2=strlen(a2);
int len3=(len1>len2)?len1:len2;
int b1[1000]={0},b2[1000]={0},c[1001]={0};
static char t[1001]={'\0'};
memset(t,'\0',sizeof(t));
int i;
for(i=0;i<len1;i++){
b1[i]=a1[len1-i-1]-'0';
}
for(i=0;i<len2;i++){
b2[i]=a2[len2-i-1]-'0';
}
for(i=0;i<=len3;i++){
c[i]=b1[i]+b2[i]+c[i];
c[i+1]=(int)c[i]/10;
c[i]=(int)c[i]%10;
}
if(c[len3]==0){
for(i=0;i<len3;i++){
t[i]=c[len3-1-i]+'0';
}
}else{
for(i=0;i<len3+1;i++){
t[i]=c[len3-i]+'0';
}
}
return t;
}
int panduanhuiwenshu(char *a){
int len=strlen(a),i,j;
for(i=0,j=len-1;i<=j;i++,j--){
if(a[i]!=a[j])
break;
}
if(i<=j)
return 0;
else
return 1;
}
char* reverse(char *a){
int i,j;
static char b[1000]={'\0'};
memset(b,'\0',sizeof(b));
int len=strlen(a);
for(i=0,j=len-1;i<len;i++,j--){
b[i]=a[j];
}
return b;
}