Đoạn code tính tổng các ước của số nguyên trong C++ không chạy được

“Một số tự nhiên được gọi là số hoàn hảo nếu các ước thực sự của nó kể cả 1 bằng chính nó . Hãy liệt kê các số hoàn hảo nhỏ hơn N.”
Em viết code theo đề bài trên, viết xong nhưng không chạy được, nhìn mãi mà không biết sai chỗ nào, Pro nào giúp em tìm ra chỗ sai với, em cảm ơn nhiều nhiều.:slight_smile:

#include<iostream>
#include<cmath>
using namespace std;
int xetUoc(int a)
{
	int uoc=0;
	for(int i=1;i<=sqrt(a);i++)
	{
		if((a%i)==0)
		{
			uoc=uoc+i;
		}
	}
	if(uoc==a)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main()
{
	int a;
	cout<<" Nhap vao so N: "<<endl;
	cin>>a;
	for(int i=1;i<a;i++)
	{
		if(xetUoc(i)==1)
		{
			cout<<i<<endl;
		}
	}
}

Sai o day i<=sqrt(a); ước của a có thể lớn hơn sqrt(a)

mình cũng bỏ đi oy để

for(int i=1;i<=a;i++)

cũng chỉ in ra giá trị 1 thui bạn à!

i<=a thì đau có số nào đâu, ngoài 1 :d, bạn để nhỏ hơn a thôi (<=a/2) cũng đươc

thank bạn nha! xinh oy! mà mình vẫn chưa hiểu, để a với a/2 có khác j nhau đâu! nếu để a thì xét giá trị i rộng hơn thui mà! sao lại ko chạy được nhỉ?
giống như:smile:
a :---------------
a/2:--------

điều kiện số hoàn hảo là ước nhỏ hơn chính nó ví dụ, 6 là số hoản hảo do 1+2+3 =6, bạn chạy tới i <=a thì thành ra 1+2 +3 +6 =12 mất rồi, thực ra bạn chạy tới (i nhỏ hơn a) cũng được nhưng không tối ưu, do không có ước nào >=a/2 cả.:smiley:

1 Like

à cái dấu =,:smile: mình ko để ý, ngớ ngẩn tiệt oy! thank bạn nhiều nha!

1 Like
for(uoc=1; uoc < sqrt(n); uoc++)
     if(n%uoc==0) tong_uoc+=uoc+n/uoc;
if(uoc*uoc==n) tong_uoc+=uoc;

Cái hàm xét ước mình nghĩ để kiểu bool chuẩn hơn :grinning:

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