Files
PAT/PATBasic/1019.c
T
2017-04-19 12:12:33 +08:00

72 lines
1.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 1019. 数字黑洞 (20)
*
* 给定任一个各位数字不完全相同的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
*/
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {return *(int*)b - *(int*)a;}
int sort(int n)
{
int digits[4] = {n/1000, n%1000/100, n%100/10, n%10};
qsort(digits, 4, sizeof(int), cmp);
return digits[0] * 1000 + digits[1] * 100 + digits[2] * 10 + digits[3];
}
int reverse(int n)
{
return n/1000 + n%1000/100 * 10 + n%100/10 * 100 + n%10 * 1000;
}
int main()
{
int N;
scanf("%d", &N);
while(1)
{
N = sort(N);
printf("%04d - %04d = %04d\n", N, reverse(N), N - reverse(N));
N = N - reverse(N);
if(N == 0 || N == 6174)
break;
}
return 0;
}