一个整数,除了本身以外的其他所有约数的和如果等于该数,那么我们就称这个整数为完全数。
例如,6 就是一个完全数,因为它的除了本身以外的其他约数的和为 1+2+3=6。
现在,给定你 N 个整数,请你依次判断这些数是否是完全数。
数据范围
1≤N≤100,
1≤X≤1e8;
PS:这道题的特点在于时间限制,如果采用暴力枚举会超时,需要对枚举的数字开平方处理,d = x / i,i = x / d;同时处理相对应的两个约数
暴力法超时
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
long n,num;
int sum = 0;
cin >> n;
for(int i = 0 ; i < n; i++){
cin >> num;
if(num == 1) sum = 0;
else sum = 1;
for(int j = 2;j < num; j++){
if(num % j == 0) sum += j;
}
if( sum == num)
cout<<num<<" is perfect"<<endl;
else
cout<<num<<" is not perfect"<<endl;
}
return 0;
}
优化后代码
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while(n--)
{
int x;
cin >> x;
int s = 0;
for(int i = 1;i * i <= x;i++)
if(x % i == 0){
if(i < x) s += i;
if(x/i < x && i != x/i) s += x/i ;
}
if(s == x) cout<< x <<" is perfect"<<endl;
else cout<< x <<" is not perfect"<<endl;
}
return 0;
}
```