题目描述
给定一个三位数,要求各位不能相同。例如,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数值变换的次数。