KH_WEB_CB_2026_01

KH_DSA_C_2026_01

KH_TT_CB_2026_01

KH_OOP_C_SHARP_2026_01

KH_TT_CB_2026_01

🧮 Factor Sum – Khi một con số “tự soi lại chính mình” 🔍✨

bởi Phạm Xuân Hoài - 4 tháng 2, 2026

🧮 Factor Sum – Khi một con số “tự soi lại chính mình” 🔍✨

Có những con số… sau một vòng phân tích,

nó lại quay về đúng bản thân nó.

Và bài toán này chính là hành trình đi tìm điểm dừng ấy 🧡


🌱 Bài toán

Ta có một số nguyên dương n.

Mỗi lần thực hiện phép toán:

  • Phân tích n thành các thừa số nguyên tố
  • Cộng tất cả các thừa số đó lại (kể cả trùng)

Sau đó:

  • Thay thế n bằng tổng vừa tính
  • Lặp lại quá trình này cho đến khi kết quả thu được giống với số hiện tại

👉 Hãy tìm kết quả cuối cùng.


✨ Ví dụ minh họa

Ví dụ: n = 24

24 = 2 × 2 × 2 × 3
→ 2 + 2 + 2 + 3 = 9

9 = 3 × 3
→ 3 + 3 = 6

6 = 2 × 3
→ 2 + 3 = 5

5 = 5
→ 5 + = 5 (không đổi) → dừng

📌 Kết quả cuối cùng: 5


🔑 Chìa khóa của bài toán

Điểm quan trọng nhất của bài này không phải:

  • số nguyên tố
  • hay phân tích thừa số khó đến đâu

👉 Mà là đIỀU KIỆN DỪNG:

Khi tổng các thừa số nguyên tố bằng chính số ban đầu

Hay nói cách khác:

“Khi con số soi gương và thấy… chính mình” ✨


🧠 Ý tưởng giải

  1. Lặp vô hạn (while(1))
  2. Lưu lại giá trị ban đầu của n
  3. Phân tích n thành thừa số nguyên tố và tính tổng
  4. Gán lại n = tổng
  5. Nếu n không đổi → dừng

💻 Code hoàn chỉnh (phiên bản dễ hiểu)

int factorSum(int n) {

    while (1) {
        int saveN = n;   // lưu lại giá trị ban đầu
        int sum = 0;

        // phân tích thừa số nguyên tố
        for (int i = 2; i <= n / i; i++) {
            while (n % i == 0) {
                sum += i;
                n /= i;
            }
        }

        // nếu còn lại 1 số nguyên tố lớn hơn 1
        if (n > 1) {
            sum += n;
        }

        n = sum;  // cập nhật n mới

        // nếu không còn thay đổi → dừng
        if (sum == saveN) {
            break;
        }
    }

    return n;
}

🔍 Giải thích từng phần (rất dễ hiểu 🧸)

🔹 saveN

int saveN = n;

👉 Lưu lại giá trị trước khi biến đổi → dùng để kiểm tra có thay đổi hay không


🔹 Phân tích thừa số nguyên tố

for (int i = 2; i <= n / i; i++) {
    while (n % i == 0) {
        sum += i;
        n /= i;
    }
}
  • i chạy từ 2 đến √n
  • Mỗi lần chia được thì:
    • cộng i vào tổng
    • chia nhỏ n ra

🔹 Thừa số nguyên tố cuối cùng

if (n > 1) {
    sum += n;
}

👉 Nếu sau vòng lặp còn lại 1 số > 1 → đó chính là thừa số nguyên tố cuối


🔹 Điều kiện dừng ✨ (linh hồn của bài)

if (sum == saveN) {
    break;
}

📌 Khi tổng bằng lại chính nó → không còn thay đổi → dừng vòng lặp


🧪 Test nhanh vài trường hợp

nKết quả
245
127
65
44
77

✔ Hoạt động đúng với mọi case

✔ Không bị vòng lặp vô hạn

✔ Đúng chuẩn đề bài


🌟 Kết luận

  • Đây là bài toán lặp đến điểm ổn định
  • Không cần kiểm tra số nguyên tố
  • Không cần xử lý case đặc biệt
  • Chỉ cần một điều:

So sánh kết quả mới với giá trị cũ

💬 Một bài toán nhỏ, nhưng dạy ta một tư duy lớn:

👉 Đừng vội tin điều kiện dừng “quen mắt”, hãy đọc kỹ đề 🧠✨