2019年GPLT L2-1 特立獨行的幸福 比賽題解 中國高校計算機大賽-團體程序設計天梯賽題解


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

在本題中,比較好理解,寫起來稍復雜,模擬即可。
step[i]是其他幸福數依附於i的的數量,has[i]是判斷i是否為幸福數,num[i]是依附於其他幸福數的數量

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<set>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
typedef long long ll;

set<int> se;
int num[12000];
int step[12000];
int has[12000];
int calc(int n) {
	se.clear();
	int m = n;
	while (m != 1) {
		se.insert(m);
		int t = 0;
		while (m) {
			int tt = m % 10;
			m /= 10;
			t += tt * tt;
		}
		num[n]++;
		step[t]++;
		m = t;
		if (se.count(m) != 0)return 0;
	}
	return 1;
}
int isprime(int n) {
	if (n == 1)return 0;
	if (n == 2)return 1;
	double q = sqrt(n);
	for (int i = 2; i <= q; i++) {
		if (n != i && n%i == 0)return 0;
	}
	return 1;
}
int main() {
	int n, m;
	cin >> n >> m;
	memset(has, 0, sizeof(has));
	memset(step, 0, sizeof(step));
	for (int i = n; i <= m; i++) {
		int t = calc(i);
		if (t == 0)has[i] = 1;
	}
	int yes = 0;
	for (int i = n; i <= m; i++) {
		if (has[i] == 0 && step[i] == 0) {
			yes = 1;
			if (isprime(i))num[i] *= 2;
			cout << i <<" "<<num[i] << endl;
		}
	}
	if (yes == 0) {
		cout << "SAD" << endl;
	}
}


免責聲明!

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



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