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 }
相關文章
相關標籤/搜索