素数难题
Time Limit: 1000ms
Case Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:
%lld Java class name:
Main
Font Size:
数论是数学中重要的一个分支。著名的数学家高斯曾经说过一句经典名言:
“
数学是科学的皇后,而数论是数学的皇后
”
。由于近代计算机科学和应用数学的发展,数论得到了广泛的应用。比如在计算方法、代数编码、组合论等方面都广泛使用了初等数论范围内的许多研究成果。在
ACM/ICPC
竞赛中也有很多和数论有关的知识和算法,我们学校的
5l2
大牛在这方面就造诣颇深。
数论中最基本、最重要的一类数是素数。一个大于
1
的正整数
p
,它除了
1
和它本身之外没有因子,就被称为是素数。(如果有某个整数
c
使得
b=ac
,那么称整数
a
是整数
b
的因子或除数)
2
,
3
,
5
,
7
,
11
,
13
,
17
,
…
这些数是素数,而比如说,
12
就不是,因为
12=3×4
。素数的重要性在于这样一个事实:每一个整数都能够表示为素数的乘积。如果一个数本身不是素数,那么可以不断地对它进行因子分解,直到所有的因子都是素数为止。例如
360=32×23×5
。一个非负整数(除了
0
和
1
),如果不是素数,就称为合数。
素数中有很多难题,很值得研究。有两个至今尚未解决的著名问题。一个叫哥德巴赫猜想,是由哥德巴赫在
1742
年给欧拉的信中提出来的。他由实验观察到,任何一个大于
2
的偶数,都能够表示成为两个素数的和。例如,
4=2+2
,
6=3+3
,
8=5+3
,
…
,
100=97+3
,
…
等等。哥德巴赫问欧拉,能不能证明这对于所有大于
2
的偶数都是成立的,或者证明是不成立的。欧拉没有给出回答,在那之后也还没有人给出回答。另外一个比哥德巴赫问题更加引人注目的问题是,以
p
和
p+2
形式出现的素数对是否是有无穷多对,在这个问题的研究上比哥德巴赫问题的进展还要少。
素数问题的研究,极大地推动了数论和数学的进步。现在我们来看一个基本的问题
——
素数判定。最朴素的方法是按照素数的定义来做
——
看它除了
1
和它本身之外是否还有因子,这种方法对于不太大的数是很方便的。除此之外,为了实现对大数的素性测试,数学家还提出了另外的一些素数测试方法,例如费马测试、米勒拉宾测试。
现在,请你写一个程序来判断一个数是不是素数。
Input
输入数据包含多行,每行一个数,
N(1<=N<=1000)
。
N=0
时输入结束,你的程序不需要处理它。
Sample Input
1 2 0
Sample Output
NO YES
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define M 1010
using namespace std;
int main()
{
int i,vit[1010],j,n;
memset(vit,0,sizeof(vit));
vit[1]=0;
vit[2]=1;
for(i=3; i<=M; i++)
{
if(i%2)
vit[i]=1;
else
vit[i]=0;
}
for(i=3; i<=M; i+=2)
{
if(vit[i])
{
for(j=i*2; j<=M; j+=i)
vit[j]=0;
}
}
while(~scanf("%d",&n)&&n)
{
if(vit[n])
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define M 1010
using namespace std;
int main()
{
int i,vit[1010],j,n;
memset(vit,0,sizeof(vit));
vit[1]=0;
vit[2]=1;
for(i=3; i<=M; i++)
{
if(i%2)
vit[i]=1;
else
vit[i]=0;
}
for(i=3; i<=M; i+=2)
{
if(vit[i])
{
for(j=i*2; j<=M; j+=i)
vit[j]=0;
}
}
while(~scanf("%d",&n)&&n)
{
if(vit[n])
printf("YES\n");
else
printf("NO\n");
}
return 0;
}