1.题目描述
6174猜想 ,1955年,卡普耶卡(D.R.Kaprekar)研究了对四位数的一种变换:任给出四位数k0,用它的四个数字由大到小重新排列成一个四位数m,再减去它的反序数rev(m),得出数k1=m-rev(m),然后,继续对k1重复上述变换,得数k2.如此进行下去,卡普耶卡发现,无论k0是多大的四位数, 只要四个数字不全相同,最多进行7次上述变换,就会出现四位数6174
2.题目分析
首先是要将四位数转换为数组,重新排序后得到最大数max和最小数min,然后n=max-min,知道n=6174为止。需要注意的是n有可能小于1000,所以需要对max进行操作是它大于1000。
3.解题思路
①四位数转数组②使用冒泡排序对数组重新排序③得到max与min并相减④判断是否等于6174
4.C代码
1 #include <stdio.h> 2 int main(){ 3 int n,mi=0,ma=0,re=0,temp=0; //mi,ma分别代表最小最大值 4 int a[4]; //申请一个长度为4的数组 5 scanf("%d",&n); //输入n 6 //循环执行,直到n=6174为止 7 while(n!=6174){ 8 // 数字转数组,存放到a中 9 for(int i=0;i<4;i++){ 10 a[i]=n%10; 11 n=(n-a[i])/10; 12 } 13 //冒泡排序,从小到大排序 14 for(int i=0;i<3;i++){ 15 for (int j=i+1;j<4;j++){ 16 if(a[j]<a[i]){ 17 temp=a[i]; 18 a[i]=a[j]; 19 a[j]=temp;} 20 } 21 } 22 //得到重新排序后的最大值最小值 23 ma=a[0]+a[1]*10+a[2]*100+a[3]*1000; 24 mi=a[0]*1000+a[1]*100+a[2]*10+a[3]; 25 while(ma<1000)ma*=10; //确保ma大于1000 26 n=ma-mi; //得到n 27 printf("%d-%d=%d ",ma,mi,n);//输出当前算式 28 re+=1; //re记录算式的个数 29 if (n==6174){ 30 break; 31 } 32 //得到6174后终止循环 33 } 34 //输出算式的总数 35 printf("%d ",re); 36 return 0; 37 }