Tại sao lệnh sum phải nằm trong for của code tìm số hoàn hảo

include<iostream>
using namespace std;

int main()
{
    long long  n,sum;
    cout << "Enter your number: "; cin >> n;
    for ( int number = 1;number  <= n;number++)
    {
        sum =0;
        for (int i = 1 ; i <= number;i++)
            if (number%i==0)
                sum+=i;
        if (sum/2.0 == number)
            cout << number << endl;
    }
    return 0;
}

Hi volocanh
Vì yêu cầu nó thế. @_@!

khai báo sum=0 trước vòng for đc ko bạn

Mình chưa hiểu rõ bài tập này lắm, bạn giải thích rõ 1 xíu đề bài được ko? Dựa vào đó mình mới biết nên để sum trong vòng for hay không!

Đề: In ra các số hoàn hảo từ 1->n. Số hoàn hảo là số có tổng các ước khác nó bằng nó.
Ví dụ: 6 = 1 + 2 + 3.

Không. i là các số trong khoảng từ 1->n, biến sum phải khởi tạo lại = 0 mỗi lần chuyển sang 1 số i mới.

Góp ý:

  • Nếu chỉ tính tổng các ước nhỏ hơn number thì cần gì phải cho vòng lặp đến <= number?
  • [quote=“volocanh1, post:1, topic:55065”]
    if (sum/2.0 == number)
    [/quote]

Đừng chia 2.0. Kết quả vế bên trái sẽ là kiểu gì cũng là số thực, vế bên phải là số nguyên. So sánh thế nào được?

  • Nếu bạn chạy vòng lặp < number thì không cần phải dùng lệnh if như trên. Chỉ cần
if (sum == number) cout << number << endl;
1 Like

Khoan, mình chưa hiểu lắm, nếu đề bài là vậy, thì cnầ gì dùng tới kiểu long? và mình cũng chưa hiểu [quote=“volocanh1, post:1, topic:55065”]
if (sum/2.0 == number)
[/quote]

để làm gì… Bạn giải thích giùm mình… Bữa trước mình làm bài này rồi, mà nhìn cách làm của bạn này mình thấy tối nghĩa quá.

long là 1 kiểu số nguyên thôi chứ có gì đâu?

Chưa hiểu cái gì?

Tổng các ước != n mà bằng n -> tổng tất cả các ước = 2*n, vì n là ước của n.

Duyệt qua từng số (!) mà không để sum trong for thì bạn để sum ở đâu đây :smile: để ở ngoài thì bạn duyệt làm gì.

1 Like
  1. sum không phải là lệnh.
  2. cùng debug nhé.
    Giả sử sum ở bên ngoài vòng lặp for, ở number = 1. sum sẽ được gán bằng 1 sau khi chạy xong vòng for bên trong. sau đó number tăng lên thành 2. thì sum sẽ tăng lên thành 4 sau khi vòng bên trong chạy xong. như vậy nếu để sum ở bên ngoài. thì sum sẽ lưu lại giá trị của vòng lặp bên ngoài. đấy là lý do sum để ở bên trong. để mỗi lần lặp vòng ở bên ngoài. thì sum lại được “làm mới” 1 lần.
1 Like

Oh, mình rõ rồi, tks! :))

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