题解 | 完数与盈数
#include <bits/stdc++.h>
#include <vector>
using namespace std;
int isFu(int x){
int ans=0;
for(int i=1;i<x;i++){
if(x%i==0)ans+=i;
}
if(x==ans)return 1;
else if(ans>x) return 2;
else return 0;
}
int main(){
vector<int>full,over;
over.push_back(2);
for(int i=3;i<=60;i++){
if(isFu(i)==1)full.push_back(i);
else if(isFu(i)==2)over.push_back(i);
}
cout<<"E: ";
for(auto a:full)cout<<a<<" ";
cout<<"G: ";
for(auto a:over)cout<<a<<" ";
}
#include <bits/stdc++.h>
#include <vector>
using namespace std;
int isFu(int x){
int ans=0,tmp=(int)sqrt(x);
for(int i=1;i<=tmp;i++){
if(x%i==0){
ans+=i;
if(i!=1)ans+=x/i;
}
}
if(tmp*tmp==x)ans-=tmp;
if(x==ans)return 1;
else if(ans>x) return 2;
else return 0;
}
int main(){
vector<int>full,over;
over.push_back(2);
for(int i=3;i<=60;i++){
if(isFu(i)==1)full.push_back(i);
else if(isFu(i)==2)over.push_back(i);
}
cout<<"E: ";
for(auto a:full)cout<<a<<" ";
cout<<"G: ";
for(auto a:over)cout<<a<<" ";
}
数据量很小,可以直接扫描,有一个简单的数学优化,可以减少一定的复杂度
