nyoj 57-6174问题(相邻元素判断问题)

57-6174问题


内存限制:64MB 时间限制:1000ms Special Judge: No
accepted:16 submit:31

题目描述:

假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数

比如输入1234执行顺序是1234->3087->8352->6174->6174,输出是4

输入描述:

第一行输入n,代表有n组测试数据。
接下来n行每行都写一个各位数字互不相同的四位数

输出描述:

经过多少次上面描述的操作才能出现循环

样例输入:

1
1234

样例输出:

4

分析:
  1、需要注意的是,要将上一步的结果存起来和下一步进行比较

核心代码:
 1 while(my_now != my_next)
 2 {
 3     ++ cnt;
 4     my_now = my_next;
 5     int temp = my_now, i = 0;
 6     while(temp)
 7     {
 8         A[i ++] = temp % 10;
 9         temp /= 10;
10     }
11     sort(A, A+4);
12     int a = A[0] + A[1] * 10 + A[2] * 100 + A[3] * 1000; // a -- max
13     int b = A[0] * 1000 + A[1] * 100 + A[2] * 10 + A[3]; // b -- min
14     my_next = a - b;
15 }

C/C++代码实现(AC):

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <stack>
 7 #include <map>
 8 #include <queue>
 9 #include <set>
10 
11 using namespace std;
12 
13 int main()
14 {
15 
16     int t;
17     scanf("%d", &t);
18     while(t --)
19     {
20         int n, cnt = 0, my_now, my_next, A[6];
21         scanf("%d", &n);
22         my_now = -1, my_next = n;
23         while(my_now != my_next)
24         {
25             cnt ++;
26             my_now = my_next;
27             int temp = my_now, i = 0;
28             while(temp)
29             {
30                 A[i ++] = temp % 10;
31                 temp /= 10;
32             }
33             sort(A, A + 4);
34             int a = A[0] + A[1] * 10 + A[2] * 100 + A[3] * 1000; // a -- max
35             int b = A[0] * 1000 + A[1] * 100 + A[2] * 10 + A[3]; // b -- min
36             my_next = a - b;
37         }
38         printf("%d
",cnt);
39     }
40     return 0;
41 }
原文地址:https://www.cnblogs.com/GetcharZp/p/9108189.html