特立獨行的幸福 (25分)

對一個十進制數的各位數字做一次平方和,稱作一次迭代。如果一個十進制數能通過若干次迭代得到 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

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int vis[10005],flag;
vector<int>s[10005];
int f(int n){//判斷素數
	if(n==1||n==0)
	return 1;
	for(int i=2;i*i<=n;i++){
		if(n%i==0)
		return 1;
	}
	return 2;
}
void g(int v,int n){
	int ans=0;
	while(n){
		ans+=(n%10)*(n%10);
		n/=10;
	}
	if(ans==1){
	   s[v].push_back(1);
	   vis[v]=1;
       return ;
	}else{
	    if(find(s[v].begin(),s[v].end(),ans)==s[v].end()){//判斷重複
		s[v].push_back(ans);
		g(v,ans);
	  }
	}
}
int main()
{
	int a,b;
	scanf("%d %d",&a,&b);
	vis[1]=1;
    for(int i=a;i<=b;i++){
    	g(i,i);
	}
	for(int i=a;i<=b;i++){
		if(vis[i]){
			for(int j=0;j<s[i].size();j++){
				vis[s[i][j]]=0;//指定區間有依附不是獨立幸福數
			}
		}
	}
	for(int i=a;i<=b;i++){
		if(vis[i]){
		    printf("%d %d\n",i,s[i].size()*f(i));
		    flag=1;
		}
	}
	if(!flag)
	printf("SAD\n");
	return 0;
 } 
發佈了105 篇原創文章 · 獲贊 117 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章