C语言 · 数字黑洞
算法提高 数字黑洞
时间限制:1.0s 内存限制:256.0MB
问题描述
任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律:
1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数;
2)将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数中含有0,则得到的数不足四位);
3)求两个数的差,得到一个新的四位数(高位零保留)。
重复以上过程,最后一定会得到的结果是6174。
比如:4312 3087 8352 6174,经过三次变换,得到6174
1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数;
2)将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数中含有0,则得到的数不足四位);
3)求两个数的差,得到一个新的四位数(高位零保留)。
重复以上过程,最后一定会得到的结果是6174。
比如:4312 3087 8352 6174,经过三次变换,得到6174
输入格式
一个四位整数,输入保证四位数字不全相同
输出格式
一个整数,表示这个数字经过多少次变换能得到6174
样例输入
4312
样例输出
3
目的明确,题意很清晰的。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int ans=0; 5 void sheng(int a[]){ 6 for(int i=0;i<4-1;i++){ 7 for(int j=0;j<4-i-1;j++){ 8 if(a[j]>a[j+1]){ 9 int t = a[j]; 10 a[j] = a[j+1]; 11 a[j+1] = t; 12 } 13 } 14 } 15 } 16 void jiang(int a[]){ 17 for(int i=0;i<4-1;i++){ 18 for(int j=0;j<4-i-1;j++){ 19 if(a[j]<a[j+1]){ 20 int t = a[j]; 21 a[j] = a[j+1]; 22 a[j+1] = t; 23 } 24 } 25 } 26 } 27 int tomax(int num){ 28 int a[4]={0}; 29 a[0] = num/1000%10;//千位 30 a[1] = num/100%10;//百位 31 a[2] = num/10%10;//十位 32 a[3] = num%10;//个位 33 jiang(a) ; 34 return a[0]*1000+a[1]*100+a[2]*10+a[3]; 35 } 36 int tomin(int num){ 37 int a[4]={0}; 38 a[0] = num/1000%10;//千位 39 a[1] = num/100%10;//百位 40 a[2] = num/10%10;//十位 41 a[3] = num%10;//个位 42 sheng(a) ; 43 return a[0]*1000+a[1]*100+a[2]*10+a[3]; 44 } 45 void dfs(int num){ 46 if(num==6174){ 47 return; 48 } 49 num=tomax(num)-tomin(num); 50 ans++; 51 dfs(num); 52 } 53 int main(){ 54 int num; 55 scanf("%d",&num); 56 dfs(num); 57 printf("%d",ans); 58 return 0; 59 }