數字黑洞

題目描述

給定任一個各位數字不完全相同的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/4045

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章