PTA basic 1019 数字黑洞 (20 分) c语言实现(gcc)
给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174
,这个神奇的数字也叫 Kaprekar 常数。
例如,我们从6767
开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
现给定任意 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
解题思路
1.用数组存储数字,四位数字重排序然后作比较 可以用数组,也可以用字符数组
2.需要注意的是边界问题,如果数字小于四位数(检测点2 3 4),需要在空位上补0, 输出的时候也要补0;
数组解法
1 #include "stdio.h" 2 #include "string.h" 3 4 void toArray(int *arr,int n){//逐位放入数组中 5 int i=0,tempI=0; 6 for(;i<4;i++){ 7 tempI=n%10; 8 n=n/10; 9 arr[i]=tempI; 10 } 11 } 12 13 void reOrder(int *n){//重排大小 小的数字在前 14 int i,j; 15 int tempI; 16 for(i=0;i<4;i++){ 17 for(j=0;j<3;j++){ 18 if(n[j]<n[j+1]){ 19 tempI=n[j]; 20 n[j]=n[j+1]; 21 n[j+1]=tempI; 22 } 23 } 24 } 25 } 26 27 int increasingOrder(int *n){//增序排列数组元素 28 int i,sum=0; 29 for(i=0;i<4;i++){ 30 sum=sum*10+n[i]; 31 } 32 return sum; 33 } 34 35 int decreasingOrder(int *n){//降序排列数组元素 36 int i,sum=0; 37 for(i=3;i>=0;i--){ 38 sum=sum*10+n[i]; 39 } 40 return sum; 41 } 42 43 int main(){ 44 int max,min,result=-1,m,temp,i,n[4]; 45 scanf("%d",&m); 46 for(i=3;i>=0;i--){//检测点 2 3 4 当数字不足四位时,需要手动补0 47 temp=m%10; 48 m=m/10; 49 n[i]=temp; 50 } 51 52 while(result!=6174&&result!=0){//结果为0或6174则结束输出 53 reOrder(n);//四位数字重排序,从小到大 54 max=increasingOrder(n);//重排后的大数字 55 min=decreasingOrder(n);//重排后的小数字 56 result=max-min; 57 toArray(n,result);//结果数字转数组 58 printf("%04d - %04d = %04d\n",max,min,result); 59 } 60 return 0; 61 }
字符数组解法
1 #include "stdio.h" 2 #include "string.h" 3 4 void tochar(char *arr,int n){//逐位转字符 5 int i=0,tempI=0; 6 for(;i<4;i++){ 7 tempI=n%10; 8 n=n/10; 9 arr[i]=(char)(tempI+'0'); 10 } 11 } 12 13 void reOrder(char *n){//重排大小 小的数字在前 14 int i,j; 15 char tempC; 16 for(i=0;i<4;i++){ 17 for(j=0;j<3;j++){ 18 if(n[j]<n[j+1]){ 19 tempC=n[j]; 20 n[j]=n[j+1]; 21 n[j+1]=tempC; 22 } 23 } 24 } 25 } 26 27 int increasingOrder(char *n){//增序排列 28 int i,sum=0; 29 char temp[5]; 30 strcpy(temp,n); 31 for(i=0;i<4;i++){ 32 sum=sum*10+(temp[i]-'0'); 33 } 34 return sum; 35 } 36 37 int decreasingOrder(char *n){//降序排列 38 int i,sum=0; 39 char temp[5]; 40 strcpy(temp,n); 41 for(i=3;i>=0;i--){ 42 sum=sum*10+(temp[i]-'0'); 43 } 44 return sum; 45 } 46 47 int main(){ 48 int max,min,result=-1,m,temp,i; 49 char n[5]; 50 scanf("%d",&m); 51 for(i=3;i>=0;i--){//检测点 2 3 4 当数字不足四位时,需要手动补0 52 temp=m%10; 53 m=m/10; 54 n[i]=temp+'0'; 55 } 56 while(result!=6174&&result!=0){//结果为0或6174则结束输出 57 reOrder(n);//四位数字重排序,从小到大 58 max=increasingOrder(n);//重排后的大数字 59 min=decreasingOrder(n);//重排后的小数字 60 result=max-min; 61 tochar(n,result);//结果转字符 62 printf("%04d - %04d = %04d\n",max,min,result); 63 } 64 return 0; 65 }