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
-
-
代码:
-
01.
#include<iostream>
02.
using
namespace
std;
03.
int
count;
04.
int
main()
05.
{
06.
bool
func(
int
m);
07.
int
i;
08.
cin>>i;
09.
while
(i--)
10.
{
11.
count=0;
12.
int
m;
13.
cin>>m;
14.
int
j=0;
15.
if
(func(m))
16.
{
17.
cout<<count<<endl;
18.
}
19.
}
20.
return
0;
21.
}
22.
bool
func(
int
m)
23.
{
24.
count++;
25.
int
a[4],min,max,n=m;
26.
for
(
int
i=0;i<4;i++)
27.
{
28.
a[i]=m%10;
29.
m=m/10;
30.
}
31.
32.
for
(
int
j=0,k,l,i;j<4;j++)
33.
{
34.
for
(k=j+1,i=j;k<4;k++)
35.
{
36.
if
(a[k]>a[i])
37.
{
38.
i=k;
39.
}
40.
}
41.
l=a[i];
42.
a[i]=a[j];
43.
a[j]=l;
44.
45.
}
46.
max=a[0]*1000+a[1]*100+a[2]*10+a[3];
47.
min=a[3]*1000+a[2]*100+a[1]*10+a[0];
48.
if
(max-min==n)
49.
{
50.
return
true
;
51.
}
52.
else
53.
{
54.
func(max-min);
55.
}
56.
57.
}
-
总结:
-
1.我使用了递归,其实就是把问题想复杂了,符合这样条件的数一定是6174.我的想法是:写一个函数设置一个全局变量,这个函数来负责排序,求最大值与最小值,然后进行递归,每递归一次全局变量的值+1,。然后打印输出全局变量的值,此时全局变量的值就是循环的次数。
-
2.我惊奇的发现还可以用c++的算法头文件来处理问题。(algorithm)
-
反省:
-
把以上的问题改正之后就会发现问题就简单了。
-
1.使用algorithm算法的头文件,algorithm里面的sort函数可以帮助排序。
-
2.满足此条件的数比为6174,所以判断条件就有了。
-
代码如下:
-
01.
#include<iostream>
02.
#include<algorithm>
03.
using
namespace
std;
04.
int
main()
05.
{
06.
int
n;
07.
cin>>n;
08.
while
(n--)
09.
{
10.
int
count=1,m,a[4];
11.
cin>>m;
12.
while
(m!=6174)
13.
{
14.
a[0]=m%10;
15.
a[1]=(m/10)%10;
16.
a[2]=(m/100)%10;
17.
a[3]=(m/1000)%10;
18.
sort(a,a+4);
19.
int
max=a[3]*1000+a[2]*100+a[1]*10+a[0];
20.
int
min=a[0]*1000+a[1]*100+a[2]*10+a[3];
21.
m=max-min;
22.
count++;
23.
}
24.
cout<<count<<endl;
25.
}
26.
return
0;
27.
}
-
第一行输入n,代表有n组测试数据。