南阳理工学院--语言入门--6174问题

本文探讨了6174问题的解决方案,通过C++实现了一个程序,该程序能够计算任意四位数经过几次操作后进入循环。介绍了两种不同的实现方法,并对比了其优劣。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值