7-44 黑洞数(20 分)
黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。
任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)
例如,对三位数207:
- 第1次重排求差得:720 - 27 = 693;
- 第2次重排求差得:963 - 369 = 594;
- 第3次重排求差得:954 - 459 = 495;
以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。
任意输入一个三位数,编程给出重排求差的过程。
输入格式:
输入在一行中给出一个三位数。
输出格式:
按照以下格式输出重排求差的过程:
序号: 数字重排后的最大数 - 重排后的最小数 = 差值
序号从1开始,直到495出现在等号右边为止。
输入样例:
123
输出样例:
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495
#include <stdio.h>
#define BLACK_HOLE 495 //定义黑洞数
int findMax(int num[]) { //组合成最大数
int result;
for (int i = 0; i < 2; i++) { //冒泡法
for (int k = 0; k < 2 - i; k++) {
int temp;
if (num[k] < num[k + 1]) {
temp = num[k];
num[k] = num[k + 1];
num[k + 1] = temp;
}
}
}
result = num[0] * 100 + num[1] * 10 + num[2];
return result;
}
int findMin(int num[]) { //组合成最小数
int result;
for (int i = 0; i < 2; i++) { //冒泡法
for (int k = 0; k < 2 - i; k++) {
int temp;
if (num[k] > num[k + 1]) {
temp = num[k];
num[k] = num[k + 1];
num[k + 1] = temp;
}
}
}
result = num[0] * 100 + num[1] * 10 + num[2];
return result;
}
int main(void) {
int operate_num, max, min, i, num[3];
scanf("%d", &operate_num);
for (i = 1;; i++) {
num[0] = operate_num / 100;
num[1] = operate_num / 10 % 10;
num[2] = operate_num % 10;
max = findMax(num);
min = findMin(num);
printf("%d: %d - %d = %d\n", i, max, min, max - min);
operate_num = max - min;
if (operate_num == BLACK_HOLE) {
break;
}
}
return 0;
}

本文介绍了一种通过编程实现的黑洞数求解算法。黑洞数,又称为陷阱数或Kaprekar问题,是一种特殊的数,任何各位数字不完全相同的三位数经过有限次的重排求差操作最终会得到495。文章详细解释了如何编写程序来展示这个过程,并给出了具体的代码实现。
3205





