POJ 3292 Semi-prime H-numbers
这个题有可能会错意啊,大家要注意……
题目大意:
定义一种数叫H-numbers,它是所有能除以四余一的数。
在H-numbers中分三种数:
1、H-primes,这种数只能被1和它本身整除,不能被其他的H-number整除,例如9是一个H-number,能被1,3,9整除,但3不是H-number,所以他是H-primes。
2、H-semi-primes是由两个H-primes相乘得出的。
3、剩下的是H-composite。
问给一个数,求1到这个数之间有多少个H-semi-primes。
解题思路:
像筛素数一样打个表就行……,注意细节
下面是代码:
#include <stdio.h> #include <string.h> #define N 1000500 int num[40],pri[N],prc=0; int vis[N+5]= {false}; void ScreeningPrime() { int i, j; for(i = 5; i <= N; i+=4) { for(j = 5; j <= N ;j+=4) { if(i*j>N) { break; } if(!vis[i]&&!vis[j]) { vis[i*j]=1; } else { vis[i*j]=-1; } } } prc=0; for(i=1; i<N; i++) { if(vis[i]==1) { prc++; } pri[i]=prc; } } int main() { int l; ScreeningPrime(); while(scanf("%d",&l),l) { printf("%d %d\n",l,pri[l]); } return 0; }