给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。
例如,我们从6767开始,将得到
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174 7641 - 1467 = 6174 ... ...
现给定任意4位正整数,请编写程序演示到达黑洞的过程。
输入格式:
输入给出一个(0, 10000)区间内的正整数N。
输出格式:
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例。注意每个数字按4位数格式输出。
输入样例1:
6767
输出样例1:
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174
输入样例2:
2222
输出样例2:
2222 - 2222 = 0000
这道题直接顺着题题目要求写,分成1111的倍数和普通数处理,需要注意的是,对于6174也需要输出一次7641-1467 = 6174。
#include <stdio.h>
#include <stdlib.h>
void handle(int *res) // 处理函数
{
int c, d, temp_val, n[6]={0, 2, 1, 0 ,2, 1};
char a[5] = {0}, b[5] = {0};
sprintf(a, "%04d", *res); // 将数字打印到数组中,方便进行排序
for (int i = 0; i < 6; i++) // 针对四个数的专用排序法,交换顺序保存在n数组中。
if (a[n[i]] > a[n[i]+1]) {
temp_val = a[n[i]+1];
a[n[i]+1] = a[n[i]];
a[n[i]] = temp_val;
}
for (int i = 0; i < 4; i++)
b[i] = a[3-i]; // 字符串逆序,如 7641 变成 1467
d = atoi(b), c = atoi(a); // 转换成整型数字
printf("%04d - %04d = %04d\n", d, c, *res = d-c);
}
int main()
{
int res;
scanf("%d", &res);
if (res % 1111 != 0) // 根据是否是1111的倍数分类
do { handle(&res); // 为保证至少进行一次循环,使用do while处理普通数字
}while (res != 6174);
else
printf("%d - %d = 0000", res, res);
return 0;
}
点这里进入试题网页