Check giúp code số hoàn hảo

Các số hoàn hảo: Một số tự nhiên được gọi là hoàn hảo nếu tổng các ước nhỏ hơn nó bằng chính nó (VD: 6=1+2+3). In ra các số tự nhiên hoàn hảo trong khoảng [n1… n2].
Input: Một dòng duy nhất chứa hai số n1 và n2.
Output: Ghi các số hoàn hảo cách nhau một dấu cách.

#include<iostream>
#include<iomanip>
#include<math.h>
using namespace std;

bool is_perfect_number(int N)
{
    int total_divisors = 0;
    for (int i = 1; i < N; ++i)
        if (N % i == 0)
            total_divisors += i;

       return(total_divisors == N);

}

int main()
{
    int n1, n2;
    cin >> n1 >> n2;

    for (int i = 1; i >= n1 and i <= n2; ++i)
        if (is_perfect_number(i))
            cout << i << " ";
}

Code của bạn chạy quá lâu.

Có 1 tính chất về ước số, nếu i là một ước của n thì n / i cũng là một ước của n. Do vậy bạn chỉ cần xét các ước không quá \sqrt{n} để cộng vào total_divisors của bạn. Cẩn thận trường hợp n là số chính phương (n = k^2 với k là 1 số nguyên) là được.

int sqrt_n = (int)sqrt(n);
for (int i = 1; i <= sqrt_n; i++) {
    if (n % i == 0) {
        // "tổng" trong tiếng Anh là sum, không phải total
        if (i == sqrt_n) // n là số chính phương
            sum_divisors += i;
        else
            sum_divisors += i + n/i;
    }
}

1 câu chuyện nhỏ nữa, số lượng các số hoàn hảo rất ít nên bạn không cần phải kiểm tra số nguyên tố làm gì cả, cứ liệt kê sẵn các số hoàn hảo trong code rồi tìm các số trong khoảng [n1, n2] là đủ.

4 Likes

:eyes:
Chạy từ đâu đến đâu vậy bạn?

2 Likes

Em cảm ơn ạ. Việc tạo biến sqrt_n có ý nghĩa gì vậy, em thử làm giống thì nó không in ra kết quả, phần code còn lại vẫn giữ nguyên.

Phải là : for (int i = n1; i <= n2; ++i) đúng không a.

1 Like

Mình có nói rồi đây bạn.

3 Likes

Vâng em hiểu.Nhưng nếu làm luôn là : for (int i = 1; i <= sqrt(n); i++) có được không ạ ?
Với cả ý em là phần code sau của em có cần sửa không vì khi em dùng đoạn code mà anh gửi thì nó không cho ra kết quả ạ.

Bạn đăng code mới của bạn lên đây xem nào. Bạn phải tự áp dụng sao cho phù hợp với code của bạn chứ.

2 Likes

Em thấy chỗ sai rồi , cảm ơn a.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?