• PAT (Basic Level) Practise: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

    提交代码:

     1 #include <stdio.h>
     2 
     3 int convert(int num, int *max, int *min)
     4 {
     5     int data[10];
     6     int max_tmp, min_tmp;
     7     int i, tmp;
     8 
     9     for(i = 0; i < sizeof(data)/sizeof(data[0]); i++)
    10         data[i] = 0;
    11 
    12     while(num != 0)
    13     {
    14         data[num%10]++;
    15         num /= 10;
    16     }
    17 
    18     max_tmp = min_tmp = 0;
    19 
    20     for(i = 0; i < 10; i++)
    21     {
    22         tmp = data[i];
    23         while(data[i] != 0)
    24         {
    25             min_tmp *= 10;
    26             min_tmp += i;
    27             data[i] -= 1;
    28         }
    29         data[i] = tmp;
    30     }
    31     
    32     for(i = 9; i >= 0; i--)
    33     {
    34         while(data[i] != 0)
    35         {
    36             max_tmp *= 10;
    37             max_tmp += i;
    38             data[i] -= 1;
    39         }
    40     }
    41 
    42     // 当输入的num小于1000时,则转换后的max_tmp会小于1000,
    43     // 需要在该数值后面补零直到大于等于1000为止
    44     while(max_tmp < 1000)
    45         max_tmp *= 10;
    46 
    47     *max = max_tmp;
    48     *min = min_tmp;
    49 
    50     return 0;
    51 }
    52 
    53 int main(void)
    54 {
    55     int num;
    56     int max, min;
    57     int diff;
    58 
    59     scanf("%d", &num);
    60 
    61     convert(num, &max, &min);
    62     if(max != min)
    63     {
    64         do{
    65             diff = max - min;
    66             printf("%04d - %04d = %04d
    ", max, min, diff);
    67             convert(diff, &max, &min);
    68         }while(diff != 6174);
    69     }
    70     else
    71     {
    72         printf("%04d - %04d = %04d", max, min, max-min);
    73     }
    74 
    75     return 0;
    76 }
  • 相关阅读:
    再次梳理css3动画部分知识
    node搭环境
    微信小程序可用的第三方库
    省市区三级联动下拉框效果分析
    jq回到顶部效果分析
    jq案例中遇到的知识点总结(会飞的小鸟和三级联动)
    js正则表达式大全
    js中表达式 >>> 0 浅析
    为什么js中要用void 0 代替undefined
    npm install、npm install --save、npm install --save --dev、npm install -S、npm install -D的区别
  • 原文地址:https://www.cnblogs.com/utank/p/4759673.html
Copyright © 2020-2023  润新知