超时代码:时间复杂度O(n^2)
#include<bits/stdc++.h>
using namespace std;
const int MAXSIZE=1001;
int main() {
int a,b;
while(cin>>a>>b) {
for(int i=a; i<=b; i++) {
int sum=0;
for(int j=1; j<i; j++) {
if(i%j==0) {
sum+=j;
}
}
if(sum==i) {
cout<<sum<<endl;
}
}
}
return 0;
}
代码二:
快速找出一个数的所有因子和,时间复杂度:O(sqrt(n))
找出所有的完数n<=10^5,时间复杂度n*sqrt(n) ,还是可能超时,但是该测试平台可以筛选出10^6
#include<bits/stdc++.h>
using namespace std;
const int MAXSIZE=1001;
int fun(int a);
int main() {
vector<int> v;
for(int i=2; i<=10000; i++) {
if(i==fun(i)) {
v.push_back(i);
}
}
int a,b;
while(cin>>a>>b) {
for(int i=0; i<4; i++)
if(v[i]>=a&&v[i]<=b)
cout<<v[i]<<endl;
}
return 0;
}
int fun(int a) {
int ans=0;
for(int i=1; i*i<=a; i++) {
if(a%i==0) {
ans+=i;
if(i!=a/i) { //去除重复的因子
ans+=a/i;
}
}
}
ans-=a;
return ans;
}
代码三:直接列出所有的完数。n<=10^5共4个
#include<bits/stdc++.h>
using namespace std;
const int MAXSIZE=1001;
int main() {
int v[4]={6,28,496,8128};
int a,b;
while(cin>>a>>b) {
for(int i=0; i<4; i++)
if(v[i]>=a&&v[i]<=b)
cout<<v[i]<<endl;
}
return 0;
}