B2127 求正整数 2 和 n 之间的完全数 题解
原题传送门
对于这道题,我们可以打表做。
数据生成器如下:
#include<iostream>
using namespace std;
bool check(int x){
int sum=0;
for(int i=1;i*i<=x;i++){//从1枚举到x的平方根就可以了,降低时间复杂度。
if(x%i==0){
sum+=i;
if(i*i!=x)sum+=x/i;//因为如果i是x的因数,则x/i也是x的因数。
//但是如果x是平方数的话,则x的平方根会被重复计算,须加上特判。
}
}
return sum-x==x;
//因为sum-x==x本身就是布尔表达式,所以可以直接返回。
}
int main(){
for(int i=2;i<=10000;i++){
if(check(i))cout<<i<<endl;
}
return 0;
}
时间复杂度为
结果如下:
(我不会告诉你,在百度百科里也能找到这个表……)
有了数据,我们便可以打表了:
#include<iostream>
using namespace std;
int n;
int main(){
ios::sync_with_stdio(0);
cin>>n;
if(n>=6)cout<<"6"<<endl;
if(n>=28)cout<<"28"<<endl;
if(n>=496)cout<<"496"<<endl;
if(n>=8128)cout<<"8128"<<endl;
return 0;
}