c++求约数时间超限的优化
刷题时,我们C++是会有时间限制的!C++一秒的计算量是一亿次,如果在5秒不能解决判为时间超限!
范围:
我们看到上述题目是双层循环,再加上取值范围,其运算量是10^10,所以我们要进行优化!
因为约数就是因数,也就是我们说的因子,所以因子都是成对出现的,我们可以在此入手,比如
i是x的因数,那么x/i同样也是x的因数,我们可以考虑枚举一般因数,另一半在枚举的时候再去计算即可!
#include<iostream>
#include<cstdio>
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;
}