题解 | 完数与盈数
#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<<" "; }
数据量很小,可以直接扫描,有一个简单的数学优化,可以减少一定的复杂度