// 演算法：對 [1, n] 中每個整數，用 % 10 與 / 10 逐位檢查。
// Algorithm: for each x in [1..n], extract digits via % 10 and / 10.
// 出現 3/4/7 立即作廢；只要有一位屬於 {2,5,6,9} 就算「好數」。
// Reject if any digit is 3/4/7; mark good if any digit is in {2,5,6,9}.

int rotatedDigits(int n) {
    int count = 0;                          // 好數的數量 / running count of good numbers
    for (int x = 1; x <= n; x++) {          // 枚舉每個候選 / iterate every candidate in [1, n]
        int y = x;                          // 複製 x，避免破壞迴圈變數 / copy so we can chip digits off without touching x
        int valid = 1;                      // 1 表示目前每位都合法 / 1 = no invalid digit (3/4/7) seen yet
        int changed = 0;                    // 0 表示目前所有位都旋轉到自己 / 0 = no digit in {2,5,6,9} seen yet
        while (y > 0) {                     // 從個位開始一路砍到 0 / peel digits until y becomes 0
            int d = y % 10;                 // d 是目前的個位數 / d is the current ones digit
            y /= 10;                        // 砍掉個位，準備處理下一位 / drop the ones digit; '/' is integer division
            if (d == 3 || d == 4 || d == 7) {  // 這三個旋轉後不是合法數字 / these rotate to nothing valid
                valid = 0;                  // 整個 x 直接作廢 / mark x as invalid
                break;                      // 不必再看其他位 / no need to inspect remaining digits
            }
            if (d == 2 || d == 5 || d == 6 || d == 9) {  // 這四個旋轉後會變成另一個數字 / these flip to a different digit
                changed = 1;                // 至少有一位會改變 / at least one digit actually changes
            }
            // d == 0/1/8 時不做事，因為旋轉後不變 / for 0/1/8 nothing to flag — they map to themselves
        }
        if (valid && changed) count++;      // 兩個條件都成立才是好數 / good = all digits valid AND something changes
    }
    return count;                           // 回傳答案 / return final count
}
