本题是要求【a,b】范围中的完数,也就是6=1+2+3;除了该数本身的其他因子之和等于该数就是完数。
大部分人能写出这个程序,在自己的编辑器上都能通过。但是牛客网的测试样例都很大,本题我一开始按照下面的程序写的,超时不能通过。后来发现1-10000内的完数就4个,大家都直接拿这四个数来做一些判断得到答案,算是一种偷分的方法吧。
后来终于发现了下面这个方法,还是和之前求素数的时候一样,把求一个素数的时间复杂度从O(n/2)降到O(根号n)。
比如说28,只需要从2判断到5即可。后面的大因数(7,14),也就是28除以小因数(2,4)的商。
/*
2009 A
[a,b]完数
6 = 1+2+3
*/
#include<iostream>
using namespace std;
int mark[100001]={0};
int len=0;
void wan(){
for(int j=6;j<9999;j++){
int sum = 1;
// 最最最关键的for循环
for(int i=2;i*i<=j;i++){
if(j%i==0){
sum = sum+i+(j/i);
}
}
if(sum == j){
mark[len++]=j;
}
}
}
int main(){
int a,b;
wan();
while(cin>>a>>b){
for(int i=0;i<len;i++){
if(mark[i]>=a&&mark[i]<=b){
cout<<mark[i]<<endl;
}
}
}
return 0;
}
/*
2009 A
[a,b]完数
6 = 1+2+3
*/
#include<iostream>
using namespace std;
bool wan(int n){
int sum = 0;
for(int i=1;i<=n/2;i++){
if(n%i==0){
sum+=i;
}
}
if(sum == n){
return true;
}else{
return false;
}
}
int main(){
int a,b;
cin>>a