小白养成记 (7)------我是素数吗 ( 线性筛法)

描述

素数又称质数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。这个题目要求你判断一个数字是否为质数,规定1不是质数。

输入

多组测试样例,第一行输入一个整数T(1<= T <= 10000000),代表有T组测试数据

接下来T行,每行有一个数字x(1 <= x <= 10000000)

输出

输出T行,如果这个数是素数输出Yes,否则输出No

线性筛法:

(1)因为判断是否为素数,所以先将所有数据存入数组a[]中并假设均为素数,将其定义为1。最终若a[i]为1,证明是素数,输出yes,若a[i]为0,证明不是素数,输出no。

(2)1不是素数,则将a[1]赋值为0

(3)因为素数的倍数一定不为素数,则将素数的倍数的值从1变为0.

(4)循环从i=2开始,依次加1。使用if条件语句进行判断,如果i是素数,将其倍数变为0。

定义一个变量 j ,表示素数 i 的倍数,j初始的话就是i的2倍;因为j也要在数据的范围内,则j的终止条件是<=10000000;

        if(a[i]==1)
	{
	   for(j=2*i;j<=10000000;j+=i)
	   {
		   a[j]=0;
	   }
	}

(5)多组输入输出样例来判断x是否为素数,只需多组输入x即可,判断素数要放在while(T--)前面

代码如下:

#include<stdio.h>
int a[10000005];
int main()
{
	int T;
	scanf("%d",&T);
	int i,j;
	a[1]=0;
	for(i=2;i<=10000000;i++)
	{
		a[i]=1;
	}
	for(i=2;i<=10000000;i++)
	{
		if(a[i]==1)
		{
			for(j=2*i;j<=10000000;j+=i)
			{
				a[j]=0;
			}
		}
	}
	while(T--)
	{
		int x;
		scanf("%d",&x);
		
		if(a[x]==1)
		{
			printf("Yes\n");
		}
		else if(a[x]==0)
		{
			printf("No\n");
		}
	}
	return 0;
}
发布了17 篇原创文章 · 获赞 19 · 访问量 625

猜你喜欢

转载自blog.csdn.net/So_cute_SJM/article/details/103285550