您的位置:首页 > 其它

1019. 数字黑洞 (20)

2017-05-28 22:37 253 查看


1019. 数字黑洞 (20)

PAT地址:https://www.patest.cn/contests/pat-b-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)、main()的a[4]一定要初始化,不然n=1000,2000...时会出错。
(2)C++   using namespace std;下有sort(),不需要自己写。
(3)printf("%04d",n):输出四位,n 不足四位,用0补足四位。

一:自己写的代码

C Code:
#include <stdio.h>

void BubbleSort(int a[],int n);
void blackhole(int n);
int main()
{
int n;
scanf("%d",&n);
blackhole(n);
return 0;
}

void blackhole(int n)
{
int a[4]={0};//一定要初始化,不然n=1000会出错。
int i;
int max, min;
for(i = 0; n > 0; i++){
a[i] = n % 10;
n /= 10;
}
BubbleSort(a,4);
max = a[0] * 1000 + a[1] * 100 + a[2] * 10 +a[3];
min = a[3] * 1000 + a[2] * 100 + a[1] * 10 +a[0];
n =  max - min;
printf("%04d - %04d = %04d\n",max,min,n);
if(n != 6174 && n != 0)
blackhole(n);
else if(n == 6174 || n == 0)//n=0||6174,递归退出。
return;
}//黑洞递归。

void BubbleSort(int a[],int n)
{
int i, j, t;
for(i = 0; i < n-1; i++)
for(j = 0; j < n - i - 1;j++)
if(a[j] < a[j+1]){
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}//对数组进行冒泡排序,由大到小。
//这里可以选择简单选择排序


二、别人写的
C++ Code:
#include <stdio.h>
#include <algorithm>
using namespace std;
int inc, de;
void gao(int x){
int a[4];
a[0] = x / 1000;
a[1] = x / 100 % 10;
a[2] = x / 10 % 10;
a[3] = x % 10;
sort(a, a + 4);
inc = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
de = a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0];
}

int main(){
int n, s;
scanf("%d", &n);
if ((n / 1000 == n / 100 % 10) && (n / 1000 == n / 10 % 10) && (n / 1000 == n % 10)){
printf("%04d - %04d = 0000\n", n, n);
return 0;
}
do{
gao(n);
s = de - inc;
printf("%04d - %04d = %04d\n", de, inc, s);
n = s;
} while (s != 6174);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: