51Nod-1106-质数检测

来源:互联网 发布:数据清洗包括什么 编辑:程序博客网 时间:2024/06/05 04:52

51Nod-1106-质数检测

                1106 质数检测给出N个正整数,检测每个数是否为质数。如果是,输出"Yes",否则输出"No"。Input第1行:一个数N,表示正整数的数量。(1 <= N <= 1000)第2 - N + 1行:每行1个数(2 <= S[i] <= 10^9)Output输出共N行,每行为 Yes 或 No。Input示例523456Output示例YesYesNoYesNo

解题方法
该题可以直接暴力通过,当然,也可以用一些素数检测方法。
那些数学大师总结出的求质数的算法多种多样,如费马素数判定法、米勒-拉宾素数判定法和AKS素数测试等。

在这里我分别用暴力与费马素数判定法来解答此题。有兴趣的可以去看看其他算法。
暴力就不多解释了,说说费马素数判定法。它一个随机算法。
首先需要对费马小定理有一个基本的认识。
费马小定理的概括如下:
假如a是一个整数,p是一个质数,那么ap1是p的倍数,即
apa(modp)
如果a不是p的倍数,即a,p互质,定理也可以写成
ap11(modp)

也就是说随机取[1,n-1]中的值赋值给a,一旦不满足费马小定理则是合数(即不是质数),否则就是质数。

若是能翻墙的,可以去维基百科上看——质数
这上面列举了很多方法。


解题代码
暴力求解质数代码, 暴力速率太慢。

import mathdef isprime(n):    if n < 2:        return False    if n == 2:        return True    N = int(math.sqrt(n)+1)    for i in range(2,N):         if n % i == 0:            return False    return TrueN = int(input())for _ in range(N):    a = int(input())    if isprime(a):        print('Yes')    else:        print('No')

费马素数判定法代码。

import randomdef isprime(n, k=128):    if n<2:        return False    #循环次数是自定义的,适当次数不要太小    for _ in range(k):        #随机取值赋值给a        a = random.randrange(1, n)        #判断是否符合费马小定理,不为1即不符合        if pow(a, n-1, n)!=1:            return False    return TrueN = int(input())for _ in range(N):    print('Yes' if isprime(int(input())) else 'No')
原创粉丝点击