PID-4220-素数难题

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

NO

YES

//水题 不知道普通的方法会

#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");
    }
}

不会超时,学会筛选法找素数以后就习惯那个了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值