數字黑洞

題目描述

給定任一個各位數字不徹底相同的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

相關文章
相關標籤/搜索