

Số hoàn hảo là số mà tổng các ước của nó bằng 22 lần chính nó.
Ví dụ: 6 là số hoàn hảo vì 6 có tổng ước là 1+2+3+6=12=2 lần số 6.
Yêu cầu: Viết chương trình nhập vào số nguyên n. In ra chữ YES nếu n là số hoàn hảo, ngược lại ghi chữ NO
Input
Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
ý tưởng thuật toán:
- Nếu n < 2 thì trả về false vì số nhỏ hơn 2 không phải số hoàn hảo.
- Tạo biến tonguoc = 1 để tính tống số ước của số n.
- Duyệt i từ 2 đến căn bậc 2 của n để tìm tống số ước của n (nếu i là ước của n thì n/i cũng là ước của n, nên chỉ cần duyệt i từ 2 đến n <= sqrt(n) để tránh lặp lại các ước đã tính):
+ Nếu n chia hết cho i thì i là ước của n, thêm i vào tonguoc và nếu i khác n/i thì cũng thêm n/i vào tonguoc.
- Nếu tonguoc == n thì trả về true, ngược lại trả về false.
Độ phức tạp:
Không gian: O(1)
Thời gian: O(sqrt(n))
$\\\\$
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool KiemTraSoHoanHao(ll n) {
if (n < 2) {
return false;
}
ll tonguoc = 1;
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
tonguoc += i;
if (i != n / i) {
tonguoc += n / i;
}
}
}
if (tonguoc == n) {
return true;
} else {
return false;
}
}
int main() {
ll n; cin >> n;
if (KiemTraSoHoanHao(n)) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
return 0;
}Hãy giúp mọi người biết câu trả lời này thế nào?
b
#include <iostream>
#include <cmath>
using namespace std;
int main() {
long long n;
cin >> n;
// Số hoàn hảo phải là số dương lớn hơn 1
if (n <= 1) {
cout << "NO";
return 0;
}
long long sum = 0;
// Duyệt đến căn bậc hai của n để tìm các cặp ước
for (long long i = 1; i * i <= n; i++) {
if (n % i == 0) {
sum += i; // i là ước
if (i * i != n) {
sum += n / i; // n/i cũng là ước
}
}
}
// Theo định nghĩa đề bài: tổng ước = 2 * n
if (sum == 2 * n) {
cout << "YES";
} else {
cout << "NO";
}
return 0;
}
Hãy giúp mọi người biết câu trả lời này thế nào?

Bảng tin