1 /* 2 * Main.c 3 * 1019. 数字黑洞 4 * Created on: 2014年8月31日 5 * Author: Boomkeeper 6 *******部分通过****** 7 */ 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 12 /* 13 *排序整数的各个位数字 14 *src[4]:原数组 15 *dstDown[4]:降序排序结果 16 *dstUp[4]:升序排序结果 17 */ 18 void sort(int dstUp[4],int dstDown[4],int src[4]){ 19 20 int i,j; 21 int temp; 22 //赋值 23 for(i=0;i<4;i++){ 24 dstUp[i]=src[i]; 25 dstDown[i]=src[i]; 26 } 27 //排序,up 28 for(i=0;i<4;i++){ 29 for(j=0;j<4-i-1;j++){ 30 if(dstUp[j]>dstUp[j+1]){ 31 temp=dstUp[j]; 32 dstUp[j]=dstUp[j+1]; 33 dstUp[j+1]=temp; 34 } 35 } 36 } 37 //排序,down 38 for(i=0;i<4;i++){ 39 for(j=0;j<4-i-1;j++){ 40 if(dstDown[j]<dstDown[j+1]){ 41 temp=dstDown[j]; 42 dstDown[j]=dstDown[j+1]; 43 dstDown[j+1]=temp; 44 } 45 } 46 } 47 } 48 49 /* 50 * 拆分整数的各位数字,以进行排序 51 * 个位:num[3] 52 * 十位:num[2] 53 * 百位:num[1] 54 * 千位:num[0] 55 */ 56 void split(int n,int num[4]){ 57 58 num[3]=n%10; 59 n/=10; 60 num[2]=n%10; 61 n/=10; 62 num[1]=n%10; 63 n/=10; 64 num[0]=n; 65 } 66 67 /* 68 * 获得排序后的新的4位整数,做差,并返回结果s 69 */ 70 int Kaprebar(int temp){ 71 72 int num1[4]={0},num2[4]={0},num3[4];//分别存储被减数、减数、差的各位数字 73 int num_1,num_2;//被减数、减数 74 75 split(temp,num3); 76 sort(num2,num1,num3); 77 78 //做差 79 num_1=num1[0]*1000+num1[1]*100+num1[2]*10+num1[3]; 80 num_2=num2[0]*1000+num2[1]*100+num2[2]*10+num2[3]; 81 temp=num_1-num_2; 82 if(temp==0){ 83 printf("%04d - %04d = %04d ",num_1,num_2,temp); 84 exit(0); 85 } else{ 86 printf("%04d - %04d = %04d ",num_1,num_2,temp); 87 } 88 //返回差 89 return temp; 90 } 91 92 int main(void) { 93 94 int n; //题目中的N 95 96 scanf("%4d", &n); 97 int temp = n; 98 99 while (temp != 6174) { 100 temp = Kaprebar(temp); 101 } 102 103 return 0; 104 }
题目链接:
http://pat.zju.edu.cn/contests/pat-b-practise/1019
.