hdu 1406 完数

和hdu1999差不多,求因子和。不过在1000内只用三个完数,打表可以0MS

#include <stdio.h>

 

#define MAXN 500001
#define MAXQ 10001

bool flag[MAXN];
int sum[MAXN];
void init()
{
    int i,j;
    for(i=1; i<=MAXN/2; i++)
    {
        for(j=i+i; j<MAXN; j+=i)
        {
            sum[j]+=i;
        }
    }
    for(i=0; i<MAXN; i++)
    {
        if(sum[i]<MAXQ && sum[i] == i)
            flag[i]=true;
    }
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("tdata.txt","r",stdin);
#endif
    init();
    int n,a,b;
    while(scanf("%d",&n)!=EOF)
    {
        while(n--)
        {
            scanf("%d %d",&a,&b);
            if(a>b) a^=b^=a^=b;
            int cnt=0;
            while(a<=b)
                if(flag[a++]) cnt++;
            printf("%d\n",cnt);
        }
    }
    return 0;
}


//*************************************************************************


#include <stdio.h>

int perfectNum[4]={6,28,496,8128};
int main()
{
#ifndef ONLINE_JUDGE
    freopen("tdata.txt","r",stdin);
#endif
    int n,a,b,i,cnt;
    while(scanf("%d",&n)!=EOF)
    {
        while(n--)
        {
            scanf("%d %d",&a,&b);
            if(a>b) a^=b^=a^=b;
            cnt=0;
            for(i=0;i<4;i++)
            {
                if(a <= perfectNum[i] && perfectNum[i] <=b)
                    cnt++;
            }
            printf("%d\n",cnt);
        }
    }
    return 0;
}

 

//*******************************************************************************************************************************************

还有一个优化的完数判别函数
bool Is_perfectNum(int n)
{
    int sum=1;
    int lim=(int)sqrt(double(n));
    for(int i=2; i<=lim; ++i)
        if(n%i == 0)
            sum += (i+n/i);
    return sum==n;
}

posted @ 2010-09-11 09:29  菜到不得鸟  阅读(301)  评论(0)    收藏  举报