递推递归练习--J(数学黑洞)

本文介绍了一个数学谜题的解决方案,通过不断重组四位数并计算最大数与最小数之差,最终达到固定点6174的过程。文章详细展示了如何使用C++编程实现这一算法,并给出了具体示例。

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

题目简述:一个四位数重新排列,最大数减去最小数得到自然数,重复该过程,最后得到6174。

解题思路:

1、既然是一个四位数,又要最大➖最小,所以考虑首先要把这四位数分开,然后求得其最大值和最小值,然后相减,重复该过程。

2、分开和组合,可以用循环来解决。

3、直到得到6174,结束循环。

4、注意输出:输出每一个得到的数然后输出有多少个数。

源代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a,c;
    while (cin>>a)
    {
        vector <int> b;
        int d,e,sum=0;
        while (a!=6174)
        {
            b.clear();
            int i=0;
        while (a)
        {
            c=a%10;
            b.push_back(c);
            a=a/10;
            i++;
        }
            if (i==3)
                b.push_back(0); //如果减完只有三位数,则需要加一个0
        sort (b.begin(),b.end());  //对数组元素进行小到大排序,因为要用最大减最小
        d=b[0]*1000+b[1]*100+b[2]*10+b[3]; //求最小值
        e=b[3]*1000+b[2]*100+b[1]*10+b[0];// 求最大值
            a=e-d;
            cout<<a<<" ";
            sum++;
        }
        cout<<endl<<sum<<endl;
    }
    return 0;
}
输入输出样例:

Sample Input

1000
1500
3000

Sample Output

999 8991 8082 8532 6174
5
5085 7992 7173 6354 3087 8352 6174
7
2997 7173 6354 3087 8352 6174
6
解题感想:数字分解问题。以前做过一些。感觉可能还有更简单的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值