1. 题目解析与需求理解
GESP认证考试中的这道编程题要求考生实现一个名为"数字黑洞"的数学游戏。题目描述大致如下:给定一个四位正整数(各位数字不完全相同),通过特定运算规则最终会收敛到6174这个神奇的数字。这个现象由印度数学家Kaprekar发现,因此也被称为Kaprekar常数。
核心运算规则分为三个步骤:
- 将数字的各位数字按非递增顺序排列,得到最大数
- 将数字的各位数字按非递减顺序排列,得到最小数
- 用最大数减去最小数,得到新的数字
这个过程不断重复,直到得到6174为止。例如以3524为例:
- 5432 - 2345 = 3087
- 8730 - 0378 = 8352
- 8532 - 2358 = 6174
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计与实现思路
2.1 输入验证处理
首先需要验证输入是否符合要求:
- 必须是4位正整数
- 各位数字不能全部相同(否则无法产生不同的最大最小数)
cpp复制bool isValid(int num) {
if(num < 1000 || num > 9999) return false;
int digits[4];
for(int i=0; i<4; i++) {
digits[i] = num % 10;
num /= 10;
}
for(int i=1; i<4; i++) {
if(digits[i] != digits[0])
return true;
}
return false;
}
2.2 数字分解与重组
核心操作是将数字分解为各位数字,然后重新组合:
cpp复制void getDigits(int num, int digits[]) {
for(int i=0; i<4; i++) {
digits[i] = num % 10;
num /= 10;
}
}
int formNumber(int digits[]) {
return digits[0]*1000 + digits[1]*100 + digits[2]*10 + di
