AcWing 725. 完全数
原题链接
中等
作者:
清风笑
,
2020-04-08 23:10:22
,
所有人可见
,
阅读 1190
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
while (n--){
int m;
cin >> m;
int sum=0;
for(int i=1;i*i<m;i++){ //这是让这道题不超时的关键点
if( m % i == 0 ){ //只要让树循环到根号m 就可以列举完所有的约数了
if ( i < m ) sum += i ; //从小的约数开始列举,如果这个数是约数
if ( i!=(m/i) && m/i < m) sum += m/i; //那么m/这个数必然是约数
if( sum >m) break; //大的约数要满足小于 m 因为m自己不算在约数里
} //小约数 不等于大约数 才把大约数加进去
} //否则完全平方数时就会加两项 显然不符合题意
if(sum==m) printf("%d is perfect\n",m);
else printf("%d is not perfect\n",m);
}
return 0;
}