6174

6174問題

時間限制:1000 ms  |  內存限制:65535 KB
難度:2
描述

假設你有一個各位數字互不相同的四位數,把所有的數字從大到小排序後得到a,從小到大後得到b,然後用a-b替換原來這個數,並且繼續操作。例如,從1234出發,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!現在要你寫一個程序來判斷一個四位數經過多少次這樣的操作能出現循環,並且求出操作的次數

比如輸入1234執行順序是1234->3087->8352->6174->6174,輸出是4

輸入
第一行輸入n,代表有n組測試數據。
接下來n行每行都寫一個各位數字互不相同的四位數
輸出
經過多少次上面描述的操作才能出現循環
樣例輸入
1
1234

樣例輸出
4

個人理解:首先將這四位數依次拆開,按從小到大排列和從大到小進行排列,用大的數減去小的數,如果所得的值不等於6174,將按剛纔的方法繼續進行,直到所得到的值等於6174,循環結束,不過不要忘了次數加1,因爲得驗證一下後面的數也爲6174.

結果 時間 內存 語言
Accepted 4 240 C
#include<stdio.h>
int main()
{
    int c;
    scanf("%d",&c);
    while(c--)//組數非負;
    {
        int a[4];
        int i,j,m,n,t,s,count=0;
        scanf("%d",&s);
        while(s!=6174)
        {
            a[0]=s/1000;//將該數個,十,百,千拆開。
            a[1]=s/100%10;
            a[2]=s/10%10;
            a[3]=s%10;
            for(i=0;i<3;i++)//使用交換法排序;
            {
                for(j=i+1;j<4;j++)
                {
                    if(a[j]>a[i])
                    {
                        t=a[j];
                        a[j]=a[i];
                        a[i]=t;
                    }
                }
            }
             m=1000*a[0]+100*a[1]+10*a[2]+a[3];
             n=1000*a[3]+100*a[2]+10*a[1]+a[0];
             s=m-n;
             count++;
        }
        printf("%d\n",count+1);
    }
    return 0;
}



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