zoukankan      html  css  js  c++  java
  • 1019 数字黑洞

    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,104​​) 区间内的正整数 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

        这一题有两个坑,一个是输出格式,减号和等号两边都有一个空格,这很容易忽略的,我前几次提交都显示有5个测试点格式错误,两个测试点答案错误,
    加了空格以后就只剩下两个测试点答案错误;第二个坑就是有几个特殊的数据,注意题目中的这句话“注意每个数字按 4 位数格式输出”,举个例子,对
    于输入0001、0002、0009、0013、0189这些数据,你按升序排序后输出的数据中前几位也都必须是0;并且如果两个数相减的结果是三位数,那你仍要按
    四位数的格式输出,比如输入0001,有1000-0001=0999。所以做题的时候一定要细心!

         下面附上代码,代码注释也比较详细

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<functional>
     4 using namespace std;
     5 int main()
     6 {
     7     int N,big,small,flag=0,result=0;
     8     int arr[4];
     9     cin>>N;
    10     while(result!=6174)
    11     {
    12         arr[0]=N/1000%10;//把N拆开存入arr
    13         arr[1]=N/100%10;
    14         arr[2]=N/10%10;
    15         arr[3]=N%10;
    16         if(arr[0]==arr[1]&&arr[1]==arr[2]&&arr[2]==arr[3])
    17         {
    18             cout<<N<<" - "<<N<<" = 0000";
    19             return 0;
    20         }
    21         sort(arr,arr+4,greater<int>()); //非递增,即降序排列
    22         big=arr[0]*1000+arr[1]*100+arr[2]*10+arr[3];
    23         sort(arr,arr+4,less<int>()); //非递减,即升序排列
    24         small=arr[0]*1000+arr[1]*100+arr[2]*10+arr[3];
    25         if(arr[0]==0&&arr[1]!=0)//升序排列时,前三位可能为零
    26             flag=1; //只有第一位是0,第二位不是0
    27         else if(arr[0]==0&&arr[1]==0&&arr[2]!=0)
    28             flag=2; //前两位是0,第三位不是0
    29         else if(arr[0]==0&&arr[1]==0&&arr[2]==0)
    30             flag=3; //前三位都是0
    31         result=big-small;
    32         N=result; //如果结果不是6174,就再次循环
    33         if(flag==1) //0189
    34         {
    35             cout<<big<<" - "<<'0'<<small<<" = "<<result<<endl;
    36             flag=0;
    37         }
    38         else if(flag==2) //0013
    39         {
    40             cout<<big<<" - "<<"00"<<small<<" = "<<result<<endl;
    41             flag=0;
    42         }
    43         else if(flag==3) //前三位都是0,又分两种情况
    44         {
    45             if(big>1000)//针对0002—0009这些数据
    46             {
    47                cout<<big<<" - "<<"000"<<small<<" = "<<result<<endl;
    48                flag=0;
    49             }
    50             else  //针对0001这一个数据
    51             {
    52                cout<<big<<" - "<<"000"<<small<<" = 0"<<result<<endl;
    53                flag=0;
    54             }
    55         }
    56         else
    57             cout<<big<<" - "<<small<<" = "<<result<<endl;
    58     }
    59     return 0;
    60 }

    ac了

  • 相关阅读:
    菜鸟浅谈软件开发项目管理
    中国准货币体系的概要简析
    使用dockercompose安装wordpress
    货币乘数
    安全测试的相关内容
    TCP三次握手和四次挥手
    HTTP协议相关
    描述浏览器登录的过程
    AJAX相关知识
    什么是热钱
  • 原文地址:https://www.cnblogs.com/buanxu/p/12813164.html
Copyright © 2011-2022 走看看