这个题有可能会错意啊,大家要注意……
题目大意:
定义一种数叫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;
}