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;
}
posted @ 2022-01-23 20:36  爪洼ing  阅读(180)  评论(0编辑  收藏  举报