zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    希望多年以后的自己不再如此迷茫
    【转载】撒旦(Satan 4.2)勒索病毒最新变种加解密分析
    java单例模式
    关于double/float 两种基本类型精度丢失的总结
    关于ecplise中一些很实用的技巧
    安装SQL Server和卸载SQL Server步骤
    我进入部门的第一周
    mysql数据库在Linux和windows下免安装实现以及框架开发碰到的问题
    jenkins发布docker到mesos
    u盘作为git仓库,完成不同地方的代码同步
  • 原文地址:https://www.cnblogs.com/utank/p/4759673.html
Copyright © 2011-2022 走看看