1098 素数个数

素数个数

1、题目内容

Description
给定两个非负整数a,b,其中0<= a,b<=1,000,000,请计算这两个数之间有多少个素数。

输入
第一行是一个整数K(1<=K<=1000),表示有多少个样例,每个样例占一行,是两个整数a和b,每个整数之间用一个空格隔开。

输出
每行输出一个样例的结果。

Sample Input
2
2 3
17 19

Sample Output
2
2

2、题目分析

这个题,该是见证了多少学子的心酸,因为,这个题要通过的话,只有唯一的一种方法——打表法,除此以外,没见过用其它方法过掉这个题的。所谓打表法,其实就可以理解为标记法,我们通过使用素数存在的规律,将范围内所有的数都做个标记,素数标记为1,不是素数的话咧,我们就标记为0。素数存在的规律是这样的:如果a为素数,那么2a,3a,4a…就都不是素数了。比如哈:2是素数吧,但是4,6,8,10…就都不是素数了。根据这个规律进行打表,就可以解决了。

3、参考代码

#include<stdio.h>
int num[1000001];//数组的定义必须放在这,因为它的下标过大,所需内存过多,所以,定义为全局的数组
int main() 
{
	int i,j,k;
	for(i=2;i<1000001;i++) //赋初始值为1
    {
    	num[i]=1;
	}
	for(i=2;i<500001;i++) //开始打表
	{
		if(num[i]) //判断这个数是不是素数,是的话就可以使用那个规律进行打表了
		{
			for(j=i+i;j<1000001;j+=i) //打表
			{
				num[j]=0;
			}
		}
	}
	scanf("%d",&k);
	while(k--)
	{
		int count=0;
		int a,b,t;
	    scanf("%d %d",&a,&b);
		if(a>b) //很容易忽略这个小细节,题目可没说a一定会小于b,所以得考虑到这个情况
		{
			t=a;
			a=b;
			b=t;
		}
		for(i=a;i<=b;i++) //区间搜索计数啦,找出素数个数
		{
		    if(num[i]) count++;	
		}
		printf("%d\n",count);	
	}
	return 0;
}

要一直对大可爱宠爱有佳~

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42987451/article/details/82857957
今日推荐