PAT 1019. 数字黑洞 (20)
Posted 来一点音乐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT 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, 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 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<stdlib.h> 5 int cmp1(const void*a,const void*b){ 6 int* c = (int*)a; 7 int* d = (int*)b; 8 return *d-*c; 9 } 10 int cmp2(const void*a,const void*b){ 11 int* c = (int*)a; 12 int* d = (int*)b; 13 return *c-*d; 14 } 15 int add(int a){ 16 int number[5]; 17 int i=0; 18 while(a){ 19 number[i++] = a%10; 20 a = a/10; 21 } 22 while(i!=4){ 23 number[i++] = 0; 24 } 25 qsort(number,i,sizeof(number[0]),cmp1); 26 int b = 0; 27 for(int j=0;j<i;j++){ 28 b = b*10+number[j]; 29 } 30 return b; 31 } 32 int sub(int a){ 33 int number[5]; 34 int i=0; 35 while(a){ 36 number[i++] = a%10; 37 a = a/10; 38 } 39 while(i!=4){ 40 number[i++] = 0; 41 } 42 qsort(number,i,sizeof(number[0]),cmp2); 43 int b = 0; 44 for(int j=0;j<i;j++){ 45 b = b*10+number[j]; 46 } 47 return b; 48 } 49 int main(){ 50 int a; 51 scanf("%d",&a); 52 int b,c; 53 if(add(a)==sub(a)){ 54 printf("%d - %d = 0000",a,a,a); 55 return 0; 56 } 57 while(1){ 58 b = add(a); 59 c = sub(a); 60 a = b-c; 61 printf("%04d - %04d = %04d\n",b,c,a); 62 if(a==6174){ 63 break; 64 } 65 } 66 67 }
以上是关于PAT 1019. 数字黑洞 (20)的主要内容,如果未能解决你的问题,请参考以下文章