Tìm số hoàn hảo nhỏ hơn n

Cho em hỏi chỗ if (sum/2.0== i) tại sao sum lại chia 2 vậy ạ

long long sohoanhao(){
	long long  n,sum;
    cout<<"Nhap so : "; 
	cin>>n;
    for(int i=1; i<=n; i++)
    {
        sum=0;
        for(int j=1; j<=i; j++)
            if (i%j==0)
                sum+=j;
        if (sum/2.0== i)
            cout<<i<<endl;
    }
	return 0;	
}

Chia 2 được rồi cần gì 2.0 :smiley: lí do là vì lỡ cộng với chính nó rồi.

Thực ra chia tới sqrt rồi + (I + n/i) thôi.

3 Likes

thì người code muốn vậy, hỏi người code

1 Like

anh có thẻ giả thích kỹ hơn hộ em dk không ạ.em mới học nên chưa biết cụ thể

Bởi vì trong code này người viết code lại đặt cả ước của chính nó nữa nên sau khi cộng vào phải chia 2.
Ví dụ : i = 6, j = 1,2,3,6. Chính vì để cho (j <= i) nên mặc dù Sum đã = 6 ( Thỏa mãn dkien(1+2+3 = 6) ), số i vẫn chia tiếp cho chính nó và cộng vào Sum => Sum = 12. Sau khi cộng với chính nó vào mặc dù tổng trước đó đã bằng 6 thì tương đương mình x2 số này lên.

Bạn có thể sửa vòng for thứ 2 là ( j < i ), sau đấy bạn sẽ không cần chia cho 2 nữa.

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