7-19 神奇的数学之回文数 (10 分)

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;
}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值