Cách kiểm tra số hoàn hảo bằng code C/C++

10
23498
Số-hoàn-hảo
Số-hoàn-hảo

Khái niệm số hoàn hảo

Mình sẽ nói về khái niệm số hoàn hảo trước nhé. Trước tiên, bạn hãy xem ví dụ sau:

  • 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ó)

Trong ví dụ trên có khái niệm ước số. Vậy ước số là gì? Giả sử có hai số a và b, nếu a chia hết cho b thì b được gọi là ước số của aƯớc số thật sự là ước số không bao gồm chính nó. Ví dụ:

  • Các ước số của số 6 bao gồm: 1, 2, 3 và 6. Vậy, ước số thật sự của số 6 bao gồm: 1, 2, 3.

Từ đó, mình đi đến khái niệm số hoàn hảo là một số mà tổng các ước số thật sự bằng chính nó. Đến đây chắc bạn đã hiểu.

Viết chương trình kiểm tra số hoàn hảo

  • Đầu tiên ta tìm các ước số thật sự của số a
  • Ta dùng một biến sum tính tổng các ước số thật sự của a
  • Kiểm tra nếu sum == a  thì a chính là số hoàn hảo
  • Lưu ý: các ước số thật sự của a luôn bé hơn hoặc bằng a/2. Các bạn dùng điều kiện này để giới hạn vòng for lại.

Code C

Kết quả sau khi chạy

Code C++

Kết quả sau khi chạy

Bài viết mình đến đây là kết thúc. Cám ơn các bạn đã theo dõi !

avatar

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.

  Subscribe  
newest oldest most voted
Notify of
Nguyễn Văn Hiếu
Guest
Nguyễn Văn Hiếu

Cảm ơn bài chia sẻ tuyệt vời của Tâm 😀

NHi
Guest
NHi

#include
int main()
{
int n,i,sum=0;
scanf(“%d”,&n);
for(i=1;i<=n/2;i++){
if(n%i==0)
sum+=i;
}
if(sum==n)
printf("YES");
else
printf("NO");
return 0;
}

Linh
Guest
Linh

Tại sao trong vòng lặp biến điều khiển phải là n/2 ạ

Vũ Hải Sơn
Guest
Vũ Hải Sơn

cho e m hỏi tí cái dòng 3 có bool check là j v ạ (e còn là học sinh nên 0 chuyên lắm

Nguyễn Văn Hiếu
Admin
Nguyễn Văn Hiếu

Nó là hàm, em học thêm về hàm nhé.

Linh
Guest
Linh

Ad cho e hỏi tại sao trong vòng lặp for biến điều khiển lại là n/2 ạ

Min Wun
Member
Min Wun

cam on tac gia

Giang Trần
Member
Giang Trần

anh ơi với thuật toán trên thì chạy đến n=10^9 thì thời gian hơi lâu.anh có phương án nào giải quyết với số lớn không ạ

PNT
Guest
PNT

mình có suy nghĩ như thế này
-hàm check() mình nghĩ i chỉ chạy tới căn n là đủ rồi vì có thể coi nó là điểm giữa
-với trường hợp số chính phương thì kết quả không sai nhưng tính nó bị sai