C语言 · 数字黑洞

算法提高 数字黑洞  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律:
  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 }
原文地址:https://www.cnblogs.com/panweiwei/p/6670544.html