给定任一个各位数字不完全相同的 4 位正整数如果我们先把 4 个数字按非递增排序再按非递减排序然后用第 1 个数字减第 2 个数字将得到一个新数一直重复这样做我们很快会停在有数字黑洞之称的 6174

1019 数字黑洞 (20分)

给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。(题目来源PAT,侵删)

例如,我们从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

—我的思路与解决方案—

思路 表示
输出形式为四位,当不足四位时前面用0补 printf("%0md",n); 表示将n输出成m位,当不够m位时用0补在前面
要用四位数的数组成的最大的数减去组成的最小的数 1.先将数的四位分离存储在数组中并进行排序,然后在对数组中的数字进行组成最大和最小的数
#include
using namespace std;
#include
int cmp(int a,int b)    //运用c++中的sort函数
{
     
    return a>b;       //进行降序排列
}
int main()
{
     
    int i,n;
    int a=0,b=0,c;
    int s[4];
    scanf("%d",&n);
    c=n;
    while(1)
        {
        a=b=0;
        	for(i=0;i<4;i++)
    		{
     
       			s[i]=c%10;   //将四位数的每一位存储到数组s[]中
        		c/=10;
    		}
    		sort(s,s+4,cmp);  //将每位进行降序排列
            for(i=0;i<4;i++)
            {
     
                a=a*10+s[i];   //a为最大值
            }
            for(i=3;i>=0;i--)
            {
     
                b=b*10+s[i]; //b为最小值
            }
            c=a-b;
			if(a==b)     //由题意知到四个数字全部相等时,输出后跳出循环
        		{
     
					printf("%04d - %04d = %04d\n",a,b,c); break;
				}
            else
				printf("%04d - %04d = %04d\n",a,b,c);   //输出格式为四位,不够前面用0补;
            if(c==6174) break;     //当结果为6147时跳出循环
        }
    
    return 0;
}

你可能感兴趣的:(PAT(Basic,PAT乙级,经验分享,算法,c++)