PAT-B 1019. 数字黑洞

题目内容:

给定任一个各位数字不完全相同的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;
}

点这里进入试题网页

你可能感兴趣的:(PAT-B 1019. 数字黑洞)