传送门
首先,这是一道需要进行优化的题目,单单依靠暴力是无法完成的。
请看第一版代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n;
int sum;
while(n--){
sum = 0;
cin>>m;
for(int j = 2; j < sqrt(m) ;j++){
if(m%j==0){
//printf("%d\n",j);
sum += j;
}
}
if(sum==m){
printf("%d is perfect\n",m);
}else{
printf("%d is not perfect\n",m);
}
}
return 0;
}
即使通过求平方根将运行范围缩小了一半也依然难逃TLE的厄运
下面参考yxc大神所讲,进行优化
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n;
int sum;
while(n--){
sum = 0;
cin>>m;
for(int j = 1; j <= sqrt(m);j++){
if(m%j==0){
if(j < m) sum += j;//约数不能是自身
if(j!=m/j&&m/j<m) sum+=m/j;
//将另一个数加入,比如6 = 2 * 3,我们加入2以后,将3也加入到sum中
}
//printf("sum = %d\n",sum);
}
if(sum==m){
printf("%d is perfect\n",m);
}else{
printf("%d is not perfect\n",m);
}
}
return 0;
}