[GESP202309 二级] 数字黑洞
GESP二级真题,多层循环、分支语句、数学函数练习,难度★✮☆☆☆。
luogu-B3866 [GESP202309 二级] 数字黑洞
题目要求
题目描述
给定一个三位数,要求各位不能相同。例如, 是符合要求的, 是不符合要求的。将这个三位数的三个数字重新排列,得到的最大的数,减去得到的最小的数,形成一个新的三位数。对这个新的三位数可以重复上述过程。神奇的是,最终一定会得到 !
试试看,重新排列 ,得到的最大数为 ,最小数为 ,它们的差是 ;变换 ,得到 ;变换 ,;变换 ,。因此,经过 次变换得到了 。
现在,输入的三位数,你能通过编程得出,这个三位数经过多少次变换能够得到 吗?
输入格式
输入一行,包含一个符合要求的三位数 。
输出格式
输出一行,包含一个整数 ,表示经过 次变换得到 。
样例输入 #1
352
样例输出 #1
4
题目分析
解题思路
- 首先,读取输入的三位数
N
。 - 初始化一个计数变量
count
,用于记录变换的次数。 - 使用一个循环来执行变换过程,直到
N
等于495
。 - 在每次循环中,首先找到
N
的最大数、最小数和中间数。 - 计算最大数和最小数的差,得到一个新的三位数
N
。 - 每次循环结束后,计数
count
增加 1。 - 当
N
等于495
时,跳出循环并输出计数count
。
{% include custom/custom-post-content-inner.html %}
示例代码
#include <cmath>
#include <iostream>
using namespace std;
int main() {
int n; // 定义变量n
cin >> n; // 读取输入的n
int count = 0; // 初始化计数为0
while (true) {
if (n == 495) { // 如果n等于495,则跳出循环
cout << count; // 输出计数
break;
}
int n1 = n % 10; // 获取n的个位数
int n2 = n / 10 % 10; // 获取n的十位数
int n3 = n / 10 / 10; // 获取n的百位数
int n_max = max(n1, max(n2, n3)); // 找到最大数
int n_min = min(n1, min(n2, n3)); // 找到最小数
int n_mid = n1 + n2 + n3 - n_max - n_min; // 计算中间数
n = n_max * 100 + n_mid * 10 + n_min - n_min * 100 - n_mid * 10 - n_max; // 更新n的值
count++; // 计数增加
}
return 0;
}
{% include custom/custom-post-content-footer.md %}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
“luogu-”系列题目可在 洛谷题库 在线评测。
“bcqm-”系列题目可在 编程启蒙题库 在线评测。
GESP/CSP 认证学习微信公众号

Last updated on