NOJ--- Find the Prime Number Again(1155)

传送   -------- http://cdn.ac.nbutoj.com/Problem/view.xhtml?id=1155


题意很纯粹 就是让你判断一个数 是不是素数 这句话 你是否正确理解 对你进行某个数的判断很重要

If the number is a prime number print "Yes", otherwise print "No" ---- 意思就是 如果是素数 输出 yes  不是就输出no

这里就涉及到一个好多小伙伴都犯错的数字 1   按照数学来说  它既不是素数 也不是合数  那么按照我刚刚上面的翻译 它不是素数 所以是输出no的

这题呢 还有一个坑点。。  很难发现的。。。

When the N is a non-postive number end of the input.   ----  只有当n <=0 时 才结束输入   而不是我们认为的当N==0 就结束输入

好了 上面这些   前戏 结束

迎来高潮 ---  神马的 素数筛选法  --- 可能自己有这概念 但很难一下子写出来  但当你看完我下面给你的代码  肯定能明白的   因为这段代码本身 还是很容易理解的


/*

参考:

首先把所有的数组元素初始化为全是素数,然后开始for循环。当我遇上某个数表示为素数时,那么它一定为素数。

反证一下:因为可以看到,在嵌套的while循环里,假如 a [ i ] 被判断为素数的那个数的倍数,那么它的倍数们全部被更正为合数,所以我最新碰到的那个数,假如不是素数,它就已经因为它的因子(为素数)被更新为合数了,所以遇上的一定是素数。

然后当for循环到结束,我们要的素数表就已经出来了。

*/


#include <iostream>
#include <cstring>
using namespace std;

#define inf 5000010

bool prime[inf];
void judge()
{
	int temp,i;
	prime[0] = prime[1] = true;
	for(i = 2; i <= inf; i++)
	{
		if( !prime[i] )
		{
			temp = i * 2;
			while(temp <= inf)
			{
				prime[temp] = true;
				temp += i; 
			}
		}
	}
}

int main()
{
	int n;
	memset( prime , false , sizeof(prime) );
	judge();
	while( ~scanf("%d",&n) )
	{
		if( n<=0 )
			break;
		printf( "%s\n",prime[n]?"No":"Yes");
	}
	return 0;
}

如果 有什么疑问 你可以在下面给我们留言 让我们的 sex god 看一眼 来 告诉你

你可能感兴趣的:(NOJ--- Find the Prime Number Again(1155))