PAT 乙级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,10​4​​) 区间内的正整数 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

/******************************************************************************/

分析:将输入的数定义为string类型,因为这样有利于遍历存为整型数组,然后进行sort排序。

printf函数可以控制输出格式

1. 格式化规定符    
Turbo C2.0提供的格式化规定符如下:    
━━━━━━━━━━━━━━━━━━━━━━━━━━    
符号  作用    
──────────────────────────    
%d  十进制有符号整数    
%u  十进制无符号整数    
%f  浮点数    
%s  字符串    
%c  单个字符    
%p  指针的值    
%e  指数形式的浮点数    
%x, %X  无符号以十六进制表示的整数    
%0  无符号以八进制表示的整数    
%g  自动选择合适的表示法    
━━━━━━━━━━━━━━━━━━━━━━━━━━    
说明:    
(1). 可以在"%"和字母之间插进数字表示最大场宽。    
例如:  %3d  表示输出3位整型数, 不够3位右对齐。    
%9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6,    
小数点占一位, 不够9位右对齐。    
%8s  表示输出8个字符的字符串, 不够8个字符右对齐。    
如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。    
但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出;    
若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。    
另外, 若想在输出值前加一些0, 就应在场宽项前加个0。     
例如:  %04d  表示在输出一个小于4位的数值时, 将在前面补0使其总宽度      
为4位。      //此题便用了这个格式

如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度,    
小数点前的数字代表最小宽度。    
例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9,  则    
第9个字符以后的内容将被删除。    
(2). 可以在"%"和字母之间加小写字母l, 表示输出的是长型数。    
例如:  %ld  表示输出long整数    
%lf  表示输出double浮点数    
(3). 可以控制输出左对齐或右对齐, 即在"%"和字母之间加入一个"-" 号可     
说明输出为左对齐, 否则为右对齐。      
例如:  %-7d  表示输出7位整数左对齐      
%-10s 表示输出10个字符左对齐
2. 一些特殊规定字符    
━━━━━━━━━━━━━━━━━━━━━━━━━━    
字符  作用    
──────────────────────────    
/n  换行    
/f  清屏并换页    
/r  回车    
/t  Tab符    
/xhh  表示一个ASCII码用16进表示,    
其中hh是1到2个16进制数    

/*****************************************************************************/ 

#include<iostream>
#include<algorithm>
using namespace std;
bool compare(int a,int b) {    return a>b;}
int main()
{
    int a[5];
    int i=0,m=0,j=0;
    string n;
    cin>>n;
    for(i=0;i<4;i++) a[i]=n[i]-'0';  //输入到a
    do{
        int sign1,sign2;
        sort(a,a+4);                    //由小到大排序 
        sign1=a[0]*1000+a[1]*100+a[2]*10+a[3];
        sort(a,a+4,compare);            //由大到小排序 
        sign2=a[0]*1000+a[1]*100+a[2]*10+a[3];
        m=sign2-sign1;
        printf("%04d - %04d = %04d\n",sign2,sign1,m);
        a[0]=m/1000;
        a[1]=(m%1000)/100;
        a[2]=(m%100)/10;
        a[3]=m%10;
    }while(m!=0&&m!=6174);
    return 0;    
}
 

猜你喜欢

转载自blog.csdn.net/qq_41094265/article/details/89155679