L2-029 特立獨行的幸福 (25分)


對一個十進制數的各位數字做一次平方和,稱作一次迭代。如果一個十進制數能通過若干次迭代得到 1,就稱該數為幸福數。1 是一個幸福數。此外,例如 19 經過 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。則 19 就是幸福數。顯然,在一個幸福數迭代到 1 的過程中經過的數字都是幸福數,它們的幸福是依附於初始數字的。例如 82、68、100 的幸福是依附於 19 的。而一個特立獨行的幸福數,是在一個有限的區間內不依附於任何其它數字的;其獨立性就是依附於它的的幸福數的個數。如果這個數還是個素數,則其獨立性加倍。例如 19 在區間[1, 100] 內就是一個特立獨行的幸福數,其獨立性為 2。

另一方面,如果一個大於1的數字經過數次迭代后進入了死循環,那這個數就不幸福。例如 29 迭代得到 85、89、145、42、20、4、16、37、58、89、…… 可見 89 到 58 形成了死循環,所以 29 就不幸福。

本題就要求你編寫程序,列出給定區間內的所有特立獨行的幸福數和它的獨立性。

輸入格式:

輸入在第一行給出閉區間的兩個端點:1。

輸出格式:

按遞增順序列出給定閉區間 [ 內的所有特立獨行的幸福數和它的獨立性。每對數字占一行,數字間以 1 個空格分隔。

如果區間內沒有幸福數,則在一行中輸出 SAD

輸入樣例 1:

10 40
 

輸出樣例 1:

19 8
23 6
28 3
31 4
32 3
 

注意:樣例中,10、13 也都是幸福數,但它們分別依附於其他數字(如 23、31 等等),所以不輸出。其它數字雖然其實也依附於其它幸福數,但因為那些數字不在給定區間 [10, 40] 內,所以它們在給定區間內是特立獨行的幸福數。

輸入樣例 2:

110 120
 

輸出樣例 2:

SAD

代碼:
#include <stdio.h>
#include <string.h>
int m,n,c;
int num[10001],flag[10001],pri[10001];
int get(int d) {
    if(num[d] != -1) return num[d];
    num[d] = -2;
    int t = d,sum = 0;
    while(t) {
        sum += (t % 10) * (t % 10);
        t /= 10;
    }
    t = get(sum);
    if(t >= 0) flag[sum] = 1;
    return num[d] = t == -2 ? t : t + 1;
}
int main() {
    memset(num,-1,sizeof(num));
    pri[0] = pri[1] = 1;
    for(int i = 2;i * i <= 10000;i ++) {
        if(pri[i]) continue;
        for(int j = i * i;j <= 10000;j += i) {
            pri[j] = 1;
        }
    }
    num[1] = 0;
    scanf("%d %d",&m,&n);
    for(int i = m;i <= n;i ++) {
        get(i);
    }
    for(int i = m;i <= n;i ++) {
        if(num[i] != -2 && !flag[i]) {
            printf("%d %d\n",i,num[i] * (2 - pri[i]));
            c ++;
        }
    }
    if(!c) printf("SAD");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM