[C++] Kiểm tra số hoàn hảo có CODE mẫu và thuật toán

Khi ta cộng tất cả các ước số của một số (ngoại trừ chính nó) lại và kết quả cuối cùng bằng chính số đó. Đó chính là một số hoàn hảo!

Nếu bạn đã bắt đầu tò mò và muốn tìm hiểu thêm về loại số đặc biệt này, thì chúng ta hay cùng tìm hiểu thông qua bài toán kiểm tra số hoàn hảo c++. Bài viết sẽ đưa ra cách xác định một số có phải là số hoàn hảo hay không và làm thế nào để tìm ra những số hoàn hảo. Bắt đầu thôi!

Bài trước: Bài 11: viết chương trình nhập vào tháng, năm cho biết tháng đó có bao nhiêu ngày c++ với số nguyên n thuộc vào đoạn [1..12] và số nguyên m. In ra màn hình tháng và số ngày của tháng trong năm m ứng với số được nhập vào.

1. Số hoàn hảo/ số hoàn thiện là gì?

Số hoàn hảo hay còn gọi là số hoàn thiện, đó là một số nguyên dương lớn hơn 0 và có tổng các ước (ngoại trừ số đó) bằng chính nó.

Ví dụ các số hoàn hảo:

  • Số 6 là một số hoàn hảo vì tổng các ước số thật sự của số 6 là: 1 + 2 + 3 = 6 (tức là bằng chính nó)
  • Số 12 không phải là một số hoàn hảo vì tổng các ước số thực sự của số 12 là: 1 + 2 + 3 + 4 + 6 = 16 (khác với chính nó)
  • Số 496: Các ước số của 496 là 1, 2, 4, 8, 16, 31, 62, 124, 248 và 496. Tổng của các ước số này cũng bằng 496.
  • Số 8128: Các ước số của 8128 là 1, 2, 4, 8, 16, 32, 64, 127, 254, 508, 1016, 2032, 4064 và 8128. Tổng của các ước số này lại bằng 8128.

Bốn số hoàn hảo đầu tiên được những người Hy Lạp cổ đại tìm ra. Đó là các số 6,28, 496 và 8128. Sau số 8128, không có số hoàn hảo nào khác được biết đến cho đến nay.

Các số hoàn hảo có một số tính chất đặc biệt và đã được nghiên cứu sâu trong lĩnh vực toán học. Chúng có liên quan mật thiết đến các khái niệm như số nguyên tố, số chính phương và dãy số Fibonacci.

2. Bài toán kiểm tra số hoàn thiện

Bài 13: Một số hoàn thiện là một số có tổng các ước của nó (không kể nó) bằng chính nó. Hãy nhập vào một số nguyên dương n và kiểm tra xem n có phải là số hoàn thiện không.
Ví dụ: số 6 là số hoàn thiện vì tổng các ước số là 1+2+3=6.

3. Mô tả thuật toán kiểm tra n có phải số hoàn hảo hay không

3.1. Thuật toán tìm ước thật sự của n

  • Đầu tiên ta tìm các ước số thật sự của số n
  • Ta dùng một biến s=0 để tính tổng các ước số thật sự của n
  • Sử dụng vòng lặp for và câu lệnh điều kiên if để kiểm tra n có chia hết i hay không. Nếu chia hết thì s=s+i;

3.2. Thuật toán in ra dãy số hoàn hảo trong c++

  • Kết thúc vòng lặp, kiểm tra nếu s == n  thì n chính là số hoàn hảo

4. Code tham khảo thuật toán tìm số hoàn hảo c++

4.1.Sử dụng vòng lặp for kiểm tra số hoàn thiện

#include<bits/stdc++.h>

using namespace std;
int main() {
  int n, i, s = 0;
  cout << "nhap so nguyen duong n: ";
  cin >> n;
  if (n < 6) cout << n << " khong la so hoan thien";
  else {
    for (i = 1; i < n - 1; i++)
      if (n % i == 0) s = s + i;
    if (s == n) cout << n << " la so hoan thien";
    else cout << n << " khong la so hoan thien";
  }
}

Chú ý: các ước số thật sự của n luôn bé hơn hoặc bằng n/2 (hoặc sqrt(n/2)). Các bạn dùng điều kiện này để giới hạn vòng for lại giúp tối ưu cách giải.

4.2. Sử dụng vòng lặp while để kiểm tra số hoàn hảo

#include<stdio.h>

int main() {
    int N;
    int S = 0;
    do {
      cout << "nhap N: ";
      cin >> N;
      if (N <= 0) {
        cout << ("\n N phai > 0. Xin nhap lai !");
      }
    } while (N <= 0);

    int i = 1;
    while (i <= N - 1) {
      if (N % i == 0) //kiem tra uoc cua N
      {
        S += i; //moi lan lap bien S tang len i
      }
      i++; //moi lan lap i tang 1
    }
    if (S == N) //neu S=N thi N la so hoan hao
    {
      cout << N << "la so hoan hao";
    } else {
      ` cout<<N<<" khong la so hoan hao";
}
}

5. Kết quả

Kết quả 1

Kết quả 2

Trên đây là cách giải bài tập kiểm tra số hoàn hảo c++ chỉ mang tính tham khảo, hỗ trợ các bạn làm quen và luyện tập với các bàn toán lập trình cơ bản. Để giải quyết được bài này bạn cần có kiến thức cơ bản cũng như nắm vững cấu cấu vòng lặp for, if…else. Nếu có bất cứ thắc mắc nào thì đừng ngần ngại liên hệ với mình nhé! Cảm ơn các bạn đã theo dõi trên ttnguyen.net

Tải full tài liệu thực hành C/C++

Bài tiếp theo: Bài 14: [C++] Tính tổng theo công thức S(n) = 1+1/3+1/5+1/7+…+1/(2*n-1)

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em