poj 3292 Semi-prime H-numbers

呃,对自己表示很无奈,明明很清晰地一道题,愣是用了好长时间才做出来,不是没思路,是没整理好思路,没法写代码,好吧,以后要加强!

题目大意:所有对4取余余一的数都为H-numbers,只有1和它本身两个因子的H-numbers数为H-primes,有两个H_primes的乘机组成的H_numbers称为H-composites,题目是给你一个数,让你求1到H的所有H-composites。

方法很简单,就是筛选法,但是还有一种情况就是,不是完全有两个H_primes组成的数,这种情况要去掉。具体看代码吧。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxx 1000010

int f[maxx+10];

void init()
{
    int i,j;
    memset(f,0,sizeof(f));
    //f[1]=1;
    for(i=5;i<maxx;i+=4)
    {
        for(j=5;j<maxx && i*j < maxx;j+=4)
        if(!f[i] && !f[j])
            f[i*j] = 1;
        else
            f[i*j] = 2;
    }
    int sum = 0;
    for(i=5; i<maxx ;i++)
    {
        if(f[i] == 1)
            sum++;
        f[i]=sum;
    }        
}

int main()
{
    int H,i;

    init();
    while (scanf("%d",&H), H)
    {
        printf("%d %d\n",H,f[H]);
    }
    return 0;
}
posted @ 2012-04-27 15:46  Misty_1  阅读(131)  评论(0编辑  收藏  举报