對一個十進制數的各位數字做一次平方和,稱作一次迭代。如果一個十進制數能通過若干次迭代得到 1,就稱該數為幸福數。1 是一個幸福數。此外,例如 19 經過 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。則 19 就是幸福數。顯然,在一個幸福數迭代到 1 的過程中經過的數字都是幸福數,它們的幸福是依附於初始數字的。例如 82、68、100 的幸福是依附於 19 的。而一個特立獨行的幸福數,是在一個有限的區間內不依附於任何其它數字的;其獨立性就是依附於它的的幸福數的個數。如果這個數還是個素數,則其獨立性加倍。例如 19 在區間[1, 100] 內就是一個特立獨行的幸福數,其獨立性為 2×4=8。
另一方面,如果一個大於1的數字經過數次迭代后進入了死循環,那這個數就不幸福。例如 29 迭代得到 85、89、145、42、20、4、16、37、58、89、…… 可見 89 到 58 形成了死循環,所以 29 就不幸福。
本題就要求你編寫程序,列出給定區間內的所有特立獨行的幸福數和它的獨立性。
輸入格式:
輸入在第一行給出閉區間的兩個端點:1<A<B≤10
4
。
輸出格式:
按遞增順序列出給定閉區間 [A,B] 內的所有特立獨行的幸福數和它的獨立性。每對數字占一行,數字間以 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
題解:這道題和廣工的"鴿子數"https://www.cnblogs.com/-yjun/p/10544139.html 很像,稍稍有點不一樣,
打表發現非幸福數無限循環時總會出現4,可以以此為依據來判斷是否為幸福數.
還有提前准備好素數表(獨立性加倍)
我比較菜,搞了兩個函數,一個判斷是否為鴿子數,另一個用來計算獨立性.
m[]數組里來記錄是否依賴其他數.
#include <bits/stdc++.h>
const int N=1e4+5;
using namespace std;
int pri[N];
int m[N];
bool op(int n){
if(n==1) return true;
if(n==4) return false;
int tmp=0;
while(n>0){
tmp+=(n%10)*(n%10);
n/=10;
}
m[tmp]=1;
return op(tmp);
}
int dfs(int n,int dep){
if(n==1) return dep;
int tmp=0;
while(n>0){
tmp+=(n%10)*(n%10);
n/=10;
}
return dfs(tmp,dep+1);
}
int main()
{
//計算素數表
for(int i=2;i<=N-5;i++){
if(pri[i]==0){
int j=i;
while(j*i<=N-5){
pri[i*j]=1;
j++;
}
}
}
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++) if(!op(i)) m[i]=1;
int f=1;
for(int i=a;i<=b;i++){
if(m[i]==0){
int ans=dfs(i,0);
if(pri[i]==0) ans*=2;
cout<<i<<" "<<ans<<endl;
f=0;
}
}
if(f) cout<<"SAD"<<endl;
//cout << "Hello world!" << endl;
return 0;
}