数字黑洞问题

题目描述

给定一个三位数,要求各位不能相同。例如,352是符合要求的,112是不符合要求的。将这个三位数的三个数字重新排列,得到的最大的数,减去得到的最小的数,形成一个新的三位数。对这个新的三位数可以重复上述过程。被奇的是,最终一定会得到495!
试试看,重新排列352,得到的最大数为532,最小数为235,它们的差是297: 变换297,得到972- 279 = 693;变换693,963-369 = 594;变换594,954-459 =495。因此,352经过4次变换得到了495。
现在,输入的三位数,你能通过编程得出,这个三位数经过多少次变换能够得到495吗?

输入描述:

输入一行,包含一个符合要求的三位数N。

输出描述:

输出一行,包含一个整数C,表示经过C次变换得到 。

代码

#include <iostream>
#include <cmath>

using namespace std;


int main() {
    uint64_t n; cin >> n;
    int ct = 0; 
    while (n != 495) {
        int a, b, c;
        a = n % 10; n /= 10; 
        b = n % 10; n /= 10;
        c = n;
        if (a > c) swap(a, c); 
        if (b > c) swap(b, c);
        if (a > b) swap(a, b);
        n = (c * 100 + b * 10 + a) - (a * 100 + b * 10 + c);
        ++ct;
    }
    cout << ct;
}

这段代码是一个求解数值变换次数的程序。它首先读取一个类型为uint64_t的整数n,并初始化一个计数变量ct为0。

然后进入一个循环,直到n的值等于495为止。在每一次循环中,它将整数n的个位数a、十位数b和百位数c提取出来,并更新n的值为将这三个数字重新排列后得到的数值。具体操作是,通过交换操作使得a、b和c按照从小到大的顺序排列,然后将c乘以100,b乘以10,a保持不变,最后得到新的n的值。接着,计数变量ct加1。

最后,程序输出计数变量ct的值,即为对n数值变换的次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值