1106 质数检测
给出N个正整数,检测每个数是否为质数。如果是,输出"Yes",否则输出"No"。
Input
第1行:一个数N,表示正整数的数量。(1 <= N <= 1000)
第2 - N + 1行:每行1个数(2 <= S[i] <= 10^9)
Output
输出共N行,每行为 Yes 或 No。
Input示例
5
2
3
4
5
6
Output示例
Yes
Yes
No
Yes
No
解题方法
该题可以直接暴力通过,当然,也可以用一些素数检测方法。
那些数学大师总结出的求质数的算法多种多样,如费马素数判定法、米勒-拉宾素数判定法和AKS素数测试等。
在这里我分别用暴力与费马素数判定法来解答此题。有兴趣的可以去看看其他算法。
暴力就不多解释了,说说费马素数判定法。它一个随机算法。
首先需要对费马小定理有一个基本的认识。
费马小定理的概括如下:
假如a是一个整数,p是一个质数,那么
ap−1
是p的倍数,即
ap≡a(modp)
如果a不是p的倍数,即a,p互质,定理也可以写成
ap−1≡1(modp)
也就是说随机取[1,n-1]中的值赋值给a,一旦不满足费马小定理则是合数(即不是质数),否则就是质数。
若是能翻墙的,可以去维基百科上看——质数
这上面列举了很多方法。
解题代码
暴力求解质数代码, 暴力速率太慢。
import math
def 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 True
N = int(input())
for _ in range(N):
a = int(input())
if isprime(a):
print('Yes')
else:
print('No')
费马素数判定法代码。
import random
def 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 True
N = int(input())
for _ in range(N):
print('Yes' if isprime(int(input())) else 'No')