給定任一個各位數字不徹底相同的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位數格 式輸出。
6767
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174
#include<stdio.h> #include<stdlib.h> int str_to_int(const void *str) { char *s=(char *)str; int i; for(i=0;i<4;i++){ if(s[i]=='\0') s[i]='0'; } return (s[0]-'0')*1000+(s[1]-'0')*100+(s[2]-'0')*10+(s[3]-'0'); } void int_to_str(const int num,char *str) { str[0]=num/1000+'0'; str[1]=num/100%10+'0'; str[2]=num/10%10+'0'; str[3]=num%10+'0'; } int comp_min(const void *a,const void *b) { return *(char*)a-*(char*)b; } int comp_max(const void *a,const void *b) { return -(*(char*)a-*(char*)b); } int main() { char str[4]={'0','0','0','0'}; int max=0,min=0,res_num=0; scanf("%s",str); res_num=str_to_int(str); qsort(str,4,sizeof(char),comp_min); min=str_to_int(str); qsort(str,4,sizeof(char),comp_max); max=str_to_int(str); do{ if(max-min==0){ printf("%04d - %04d = 0000\n",max,min); break; }else if(max<=0||max>=10000||min<=0||min>=10000) break; printf("%d - %04d = %d\n",max,min,max-min); res_num=max-min; int_to_str(max-min,str); qsort(str,4,sizeof(char),comp_min); min=str_to_int(str); qsort(str,4,sizeof(char),comp_max); max=str_to_int(str); }while(res_num!=max-min); return 0; }
原題連接:https://www.nowcoder.com/pat/6/problem/4045ide