

Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
`+` Bài này chỉ cần định nghĩa hàm kiểm tra số "gần hoàn hảo", nếu `a_i` là số "gần hoàn hảo" thì lưu lại là được.
`+` Hàm kiểm tra số "gần hoàn hảo":
`-` Vì `a_i <= 10^6` nên không thể cho `i` lặp từ `1` đến `x` luôn được mà chỉ lặp từ `1` đến `\sqrt(x)`
`-` Nếu `x` chia hết cho `i` thì tăng biến tổng lên `i`, nếu `x/i!=i` thì tăng biến tổng lên thêm `x/i`.
`-` Kết thúc vòng lặp, trả về biểu thức `2*x<=\text{biến tổng}`.
`+` Sau khi xong, chỉ cần xuất ra số lượng và từng giá trị là xong.
`+` Code:
#include <iostream>
#include <vector>
using namespace std;
bool ganhoanhao(int x)
{
int sum = 0;
for (int i=1; i*i<=x; i++)
{
if (x%i==0)
{
sum += i;
if (x/i!=i) sum += x/i;
}
}
return 2*x<=sum;
}
int main()
{
//Bỏ comment 2 dòng dưới nếu nhập xuất file.
//freopen("GHH.INP","r", stdin);
//freopen("GHH.OUT","w",stdout);
int n;
cin >> n;
vector<int> r;
for (int i=0; i<n; i++)
{
int t;
cin >> t;
if (ganhoanhao(t)) r.push_back(t);
}
cout << r.size() << endl;
for (int i:r) cout << i << endl;
}
`+` Chạy code: Ảnh
$\\$
`@Daoanhviet96`
Hãy giúp mọi người biết câu trả lời này thế nào?
Bảng tin
2007
38835
2019
#include <bits/stdc++.h> using namespace std; int main() { long long s=0, n, a[10002], j, d[10002]; int dem=0; cin>>n; for(int i=1; i<=n; i++) { cin>>a[i]; s=0; for (int j = 1; j <= a[i]; j++) { if(a[i]%j==0) s+=j; } if(s>=2*a[i]) { dem=dem+1; d[dem]=a[i]; } } cout<<dem<<endl; for(int i=1; i<=dem; i++) cout<<d[i]<<endl; return 0; } Rút gọn#include <bits/stdc++.h> using namespace std; int main() { long long s=0, n, a[10002], j, d[10002]; int dem=0; cin>>n; for(int i=1; i<=n; i++) { cin>>a[i]; s=0; for (int j = 1; j <= a[i]; j++) { i... xem thêm
2901
47938
1864
code cuả bạn về cơ bản là đúng rồi nhé, nhưng như mình nói ở trên, vì `a_i<=10^6` nên không thể cho `i` chạy từ `1` đến `a_i` mà chỉ chạy đến `\sqrt(a_i)` thôi. Bạn tham khảo code tính tổng ước chạy đến `\sqrt(x)` nhé (do bạn không dùng hàm nên để chạy thì bạn thay biến `i` thành `j` và `x` thành `a_i` nhé.) int sum = 0; for (int i=1; i*i<=x; i++) { if (x%i==0) { sum += i; if (x/i!=i) sum += x/i; } } Rút gọncode cuả bạn về cơ bản là đúng rồi nhé, nhưng như mình nói ở trên, vì `a_i<=10^6` nên không thể cho `i` chạy từ `1` đến `a_i` mà chỉ chạy đến `\sqrt(a_i)` thôi. Bạn tham khảo code tính tổng ước chạy đến `\sqrt(x)` nhé (do bạn không dùng hàm nên để chạy... xem thêm
2007
38835
2019
hmm
2007
38835
2019
mình có thể xin fb bạn để hỏi rõ hơn được không á
2901
47938
1864
Acc clone thôi nhé =)) id:100084991451171
2007
38835
2019
sao lại dùng acc clone =))
2007
38835
2019
mà thôi không sao bạn check ib nha
1
386
1
mấy bn cho tui xin code bài này ik tui cũng đang cần còn 1 lần nộp duy nhất thôi