笔记
#include <iostream>
using namespace std;
int main()
{
int n; cin >> n;
while (n --)
{
int x, sum = 0; cin >> x;
// 使用约数的优化写法,不需要枚举所有
for (int i = 1; i * i <= x; i ++)
{
if (x % i == 0)
{
if (i < x) sum += i;
if (i != x / i && x / i < x) sum += x / i;
}
}
if (sum == x) cout << x << " is perfect" << endl;
else cout << x << " is not perfect" << endl;
}
return 0;
}
条件
i*i<x
即可,不需要i*i<=x
,刚才看你还是写的第一种情况,怎么又改了?根据数论,一个完全数不可能是某数的平方。所以等号没必要。
https://www.acwing.com/problem/content/728/ 完全数是不可能是某数的平方,但是在其它场景在约数这样写更加规范一些,就改了。