#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int getNum(int x, int y)
{
if(x < 1 || x > y)
return 0;
bool * bPrime = (bool *)malloc(y * sizeof(bool));
bPrime[0] = false;
bPrime[1] = false;
for(int i = 2; i < y; i++)
{
bPrime[i] = true;
}
for(int i = 2; i < y; i ++)
{
if(bPrime[i])
{
if(y/i < i)
{
break;
}
for(int j = i * i; j < y; j += i)
{
bPrime[j] = false;
}
}
}
int nPrime = 0;
for(int i = 2; i < y; i++)
{
if(bPrime[i])
nPrime++;
}
int * Prime = (int *)malloc(nPrime * sizeof(int));
for(int i = 2, j = 0; i < y; i++)
{
if(bPrime[i])
{
Prime[j++] = i;
}
}
int nHalfPrime = 0;
for(int i = 0; i < nPrime; i++)
{
if(y / Prime[i] < Prime[i])
{
break;
}
for(int j = i; j < nPrime; j++)
{
if(j != i && y / Prime[i] < Prime[j])
{
break;
}
int HalfPrime = Prime[i] * Prime[j];
if(HalfPrime >= x)
{
nHalfPrime++;
}
}
}
free(Prime);
free(bPrime);
return nHalfPrime;
}
int main()
{
printf("%d\n",getNum(2, 2000000));
}
质数是大家熟知的概念,我们定义一个半质数的概念:如果一个数恰好是两个质数的乘积(可以相同),则称它为半质数。前几个半质数是 4, 6, 9, 10, 14, 15, 21, 22, 25, 26。我们的问题是,输入两个正整数x<=y,问[x,y]之间有多少个半质数? 输入:x,y 输出:[x,y]之间有多少个半质数。 输入数据范围 1<=x<=y<=2000000。
代码: