首页 > 技术文章 > 48.6174猜想

19991201xiao 2018-03-06 21:42 原文

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\n",ma,mi,n);//输出当前算式
28     re+=1; //re记录算式的个数
29     if (n==6174){
30         break;
31     }
32        //得到6174后终止循环
33     }
34        //输出算式的总数
35     printf("%d\n",re);
36     return 0;
37 } 

 

 

推荐阅读