C趣味程序百例(26)卡布列克常數(shù)

字號:

83.卡布列克常數(shù)
     驗(yàn)證卡布列克運(yùn)算。任意一個四位數(shù),只要它們各個位上的數(shù)字是不全相同的,就有這樣的規(guī)律:
     1)將組成該四位數(shù)的四個數(shù)字由大到小排列,形成由這四個數(shù)字構(gòu)成的的四位數(shù);
     2)將組成該四位數(shù)的四個數(shù)字由小到大排列,形成由這四個數(shù)字構(gòu)成的最小的四位數(shù)(如果四個數(shù)中含有0,則得到的數(shù)不足四位);
     3)求兩個數(shù)的差,得到一個新的四位數(shù)(高位零保留)。
     重復(fù)以上過程,最后得到的結(jié)果是6174,這個數(shù)被稱為卡布列克數(shù)。
    *問題分析與算法設(shè)計
     題目中給出的處理過程很清楚,算法不需要特殊設(shè)計,可按照題目的敘述直接進(jìn)行驗(yàn)證。
    *程序與程序注釋
    #include
    void vr6174(int);
    void parse_sort(int num,int *each);
    void max_min(int *each,int *max,int *min);
    void parse_sort(int num,int *each);
    int count=0;
    void main()
    {
     int n;
     printf("Enter a number:");
     scanf("%d", &n); /*輸入任意正整數(shù)*/
     vr6174(n); /*調(diào)用函數(shù)進(jìn)行驗(yàn)證*/
    }
    void vr6174(int num)
    {
     int each[4],max,min;
     if(num!=6174&&num) /*若不等于74且不等于0則進(jìn)行卡布列克運(yùn)算*/
     {
     parse_sort(num,each); /*將整數(shù)分解,數(shù)字存入each數(shù)組中*/
     max_min(each,&max,&min); /*求數(shù)字組成的值和最小值*/
     num=max-min; /*求值和最小值的差*/
     printf("[%d]: %d-%d=%d\n",++count,max,min,num); /*輸出該步計算過程*/
     vr6174(num); /*遞歸調(diào)用自身繼續(xù)進(jìn)行卡布列克運(yùn)算*/
     }
    }
    void parse_sort(int num,int *each)
    {
     int i,*j,*k,temp;
     for(i=0;i<=4;i++) /*將NUM分解為數(shù)字*/
     {
     j=each+3-i;
     *j=num%10;
     num/=10;
     }
     for(i=0;i<3;i++) /*對各保數(shù)字從小到大進(jìn)行排序*/
     for(j=each,k=each+1;j     if(*j>*k) { temp=*j;*j=*k;*k=temp;}
     return;
    }
    void max_min(int *each,int *max,int *min) /*將分解的數(shù)字還原為整數(shù)和最小整數(shù)*/
    {
     int *i;
     *min=0;
     for(i=each;i     *min=*min*10+*i;
     *max=0;
     for(i=each+3;i>=each;i--) /*還原為的整數(shù)*/
     *max=*max*10+*i;
     return;
    }
    *運(yùn)行結(jié)果
     1) Enter a number:4312
     [1]:4312-1234=3078
     [2]:8730-378=8352
     [3]:8532-2358=6174