開啟章節選單

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 是原始輸入的數字

解題思路

這題的核心是「模擬 + 判環」。

  1. 對每個輸入數字反覆做:把各位數字平方後加總,得到下一個狀態。
  2. 若過程中出現 n == 1,代表它是 Happy number。
  3. 若某個數字重複出現,代表進入循環,不可能再到 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";
        }
    }
}