開啟章節選單
10591 Happy Number
題目翻譯
給你多筆測資,每筆是一個整數 n。
把 n 的每一位數字平方後加總,得到下一個數字;重複這個過程。
如果最後可以變成 1,就稱它是 Happy number;如果會進入循環而永遠不會到 1,就稱它是 Unhappy number。
請依照題目格式輸出每筆測資的判定結果。
輸入
第一行包含一個整數 T,代表測試測資的數量 接下來有 T 行,每行包含一個正整數 N (N<109)
輸出
對於每筆測資,判斷後輸出任一行
Case #I: N is a Happy number. Case #I: N is an Unhappy number.
I 代表第幾筆測資(從 1 開始),N 是原始輸入的數字
解題思路
這題的核心是「模擬 + 判環」。
- 對每個輸入數字反覆做:把各位數字平方後加總,得到下一個狀態。
- 若過程中出現
n == 1,代表它是 Happy number。 - 若某個數字重複出現,代表進入循環,不可能再到
1,就是 Unhappy number。
程式裡用 set<int> 記錄已出現過的值,檢查是否重複即可。每筆測資獨立處理,最後按照 Case #k: ... 的格式輸出。
程式碼
#include <bits/stdc++.h> using namespace std; #define int long long #define idonthavegirlfriend ios::sync_with_stdio(0), cin.tie(0); #define pb push_back #define yn(a) (a ? "Yes\n" : "No\n") // #include <atcoder/fenwicktree> // #include <atcoder/dsu> // using namespace atcoder // author:Jackis666 signed main() { idonthavegirlfriend int t; cin >> t; int idx = 0; while (t--) { int n; cin >> n; set<int> s; int nn = n; while (n > 1) { if (s.count(n)) break; s.insert(n); int nx = 0; while (n > 0) { nx += (n % 10) * (n % 10); n /= 10; } n = nx; } if (n == 1) { cout << "Case #" << ++idx << ": " << nn << " is a Happy number.\n"; } else { cout << "Case #" << ++idx << ": " << nn << " is an Unhappy number.\n"; } } }