黑洞数:
是指于四位数中,只要数字不完全相同,将数字由大到小的排列减去由小到大的排列。假设一开始选定的数字为
,
=f(
),
=f(
),...,
=f(
) 用同样的规则继续算下去,最后的结果一定是
6174
。 比如说一开始选定9891,则f(9891)=9981-1899=8082,f(8820)=8820-0288=8532,f(8532)=8532-2358=6174,f(7641)=7641-1467=6174~
其他的四位数经过这样一系列的运算后,在七步之内都会对应到6174。这种现象类似
黑洞(进去后就出不来了),故称为黑洞数。
![x_1](http://upload.wikimedia.org/math/f/9/a/f9a3b8e9e501458e8face47cae8826de.png)
![x_2](http://upload.wikimedia.org/math/8/f/4/8f43fce8dbdf3c4f8d0ac91f0de1d43d.png)
![x_1](http://upload.wikimedia.org/math/f/9/a/f9a3b8e9e501458e8face47cae8826de.png)
![x_3](http://upload.wikimedia.org/math/a/4/f/a4f66ba447cf765d4612169b07207e8d.png)
![x_2](http://upload.wikimedia.org/math/8/f/4/8f43fce8dbdf3c4f8d0ac91f0de1d43d.png)
![x_n](http://upload.wikimedia.org/math/6/7/b/67b68721103b5a16194f4b3e3ec222db.png)
![x_{n-1}](http://upload.wikimedia.org/math/3/2/0/320eb171f9774f65eafb058ec460bf39.png)
其它位数的状
其实并非只有四位数有这样的状况,三位数也有一数495,任何三位数经过这样的运算都会对应到495。其它位数就没有像三位数及四位数这样单纯的状况,会对应到不只一种结果,或是进入数字循环(即数个数循环对应)。
5位数的状况:没有黑洞,有3个循环
-
71973
83952
74943
62964
71973
-
82962
75933
63954
61974
82962
-
53955
59994
53955
6位数的状况:有2个黑洞631764、549945,还有1个7个成员的循环
-
420876
851742
750843
840852
860832
862632
642654
420876
7位数的状况:没有黑洞,只有1个8成员的循环
-
7509843
9529641
8719722
8649432
7519743
8429652
7619733
8439522
7509843
- 8位数的状况:有2个黑洞63317664、97508421
9位数的状况:有2个黑洞554999445、864197532
10位数的状况:有3个黑洞6333176664、9753086421、9975084201
6174问题
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到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
-
#include<stdio.h> int main() { int n; int a[4], c1, c2,c3; int tmp; int i, j; int count; scanf("%d",&n); while(n--) { count = 0; scanf("%1d%1d%1d%1d",&a[0],&a[1],&a[2],&a[3]); while(c3 ){ //printf("%d%d%d%d\n",a[0],a[1],a[2],a[3]); count++; for(i = 0; i < 3; i++) for(j = i + 1; j < 4 ; j++) { if(a[i] < a[j]){ tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } c1 = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3]; c2 = a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0]; c3 = c1 - c2; if(c3 == 6174){ printf("%d\n",count + 1); break; } a[0] = c3 / 1000; a[1] = c3 % 1000 / 100; a[2] = c3 % 100 /10; a[3] = c3 % 10; } } return 0; }
-
第一行输入n,代表有n组测试数据。