A. 素数难题
Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:
%lld Java class name:
Main
数论是数学中重要的一个分支。著名的数学家高斯曾经说过一句经典名言:
“
数学是科学的皇后,而数论是数学的皇后
”
。由于近代计算机科学和应用数学的发展,数论得到了广泛的应用。比如在计算方法、代数编码、组合论等方面都广泛使用了初等数论范围内的许多研究成果。在
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
NOYES
//水题 不知道普通的方法会
#include<stdio.h> #include<string.h> int main() { int a[1005],i,j; memset(a,0,sizeof(a)); a[1]=1;//1不是素数直接标记 for(int i=2;i<=1000;i++)//筛选法找素数的过程,把那些是素数的倍速的点都标记为1 { if(a[i]==0) for(int j=2*i;j<=1000;j+=i) a[j]=1; } int n; while(~scanf("%d",&n)) { if(n==0) break; if(a[n]==0)//是素数的都标记为了1 printf("YES\n"); else printf("NO\n"); } }
不会超时,学会筛选法找素数以后就习惯那个了。