1. 题目背景与需求解析
数字黑洞是数学中一个有趣的现象,也是编程竞赛中常见的算法练习题。在GESP C++二级认证考试中出现的这道题目,主要考察考生对以下核心能力的掌握:
- 数字处理与转换能力
- 循环结构的灵活运用
- 基础算法的实现技巧
题目要求实现一个数字变换过程:对于任意一个四位数(各位数字不完全相同),通过特定变换规则最终都会收敛到6174这个神奇的数字。这个变换规则包含以下步骤:
- 将数字的各位数字按非递增顺序排列,得到最大数
- 将数字的各位数字按非递减顺序排列,得到最小数
- 用最大数减去最小数,得到新的数字
- 重复上述过程,直到得到6174为止
注意:题目明确要求输入是一个四位数,且各位数字不能完全相同(否则第一步就无法得到不同的最大最小数)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法设计与实现
2.1 数字分解与重组
处理这类数字变换问题的第一步,就是要掌握数字的分解与重组技巧。在C++中,我们可以用以下方法实现:
cpp复制// 将四位数分解为各个位
void splitDigits(int num, int digits[4]) {
digits[0] = num / 1000; // 千位
digits[1] = (num / 100) % 10; // 百位
digits[2] = (num / 10) % 10; // 十位
digits[3] = num % 10; // 个位
}
// 将数字数组重组为整数
int combineDigits(int digits[4]) {
return digits[0]*1000 + digits[1]*100 + digits[2]*10 + digits[3];
}
2.2 数字排序算法实现
要实现数字黑洞变换,关键步骤是对数字进行升序和降序排列。虽然可以使用标准库的sort函数,但为了展示算法原理,这里手动实现冒泡排序:
cpp复制// 冒泡排序实现(降序)
void sortDescending(int digits[4]) {
for(int i=0; i<3; i++) {
for(int j=0; j<3-i; j++) {
