数字黑洞
题目描述
给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174
,这个神奇的数字也叫 Kaprekar 常数。
例如,我们从6767
开始,将得到
1 | 7766 - 6677 = 1089 |
现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。
输入格式
输入给出一个$ (0,10^4 )$ 区间内的正整数 N。
输出格式
如果 N 的 4 位数字全相等,则在一行内输出 N - N = 0000
;否则将计算的每一步在一行内输出,直到 6174
作为差出现,输出格式见样例。注意每个数字按 4
位数格式输出。
输入样例1
1 | 6767 |
输出样例1
1 | 7766 - 6677 = 1089 |
输入样例2
1 | 2222 |
输出样例2
1 | 2222 - 2222 = 0000 |
问题解决
解题思想
设置num[]数组存放四位数的各位数字,num[3]存放千位,num[0]存放个位;提取出n的各位数字之后,采用C++标准库函数sort()对四位数字分别进行升序和降序的排序(注意sort()函数默认是按升序排序,降序排序时需要自行设置cmp_desc()函数以实现降序排序),然后将排序后的各位数字再次分别合成升序四位数asc和降序四位数des;最后按照四位数格式输出运算过程中的各整数。特别需要注意以下几点:
- 题目中已经说明n一定是正整数,因此输入的n不会是0(第一次不会因此退出循环而导致无输出),但n可能为
6174
,若n的输入为6174
时,需要进入循环输出一次再退出循环,此处我用flag标记控制。(注:PAT评测系统是有一个测试点输入为6174
的,若不特殊处理将导致此测试点不通过比如若将代码中while循环的条件改为下面的情况将产生部分错误)
1 | while(n != 0&&n != 6174) |
- 注意题目要求按四位格式输出整数,因此需要控制整数的输出。若在计算过程中asc或者des或者n出现三位数以下的情况(比如0189),输出的高位要补0。
代码示例(C/C++)
1 |
|
题目来源:PAT乙级1019
作者:CHEN, Yue
单位:浙江大学