因为在之前4-4哥德巴赫猜想里有相关的代码,所以本题做起来还算轻松。正确代码如下:
python
N=int(input())
def is_prime(i):
if i<=1:
return False
if i>1 and i<=3:
return True
if i%2==0 or i%3==0:
return False
for r in range(5,int(i**0.5)+1, 6):
if i%r==0 or i%(r+2) == 0:
return False
return True
for a in range(N):
M=int(input())
if is_prime(M):
print("Yes")
else:
print("No")
下面这个是经过修改还是有问题的代码。
python
N=int(input())
for a in range(N):
M=int(input())
def is_prime(i):
if i<=1:
return False
if i>1 and i<=3:
return True
if i%2==0 or i%3==0:
return False
for r in range(5,int(i**0.5)+1, 6):
if i%r==0 or i%(r+2) == 0:
return False
return True
if is_prime(M):
print("Yes")
else:
print("No")
代码的逻辑错误在于缩进和循环的位置:
-
先读入 N
-
循环 N 次,每次读入一个 M,但每次都覆盖掉之前的 M
-
循环结束后,只有最后一个输入的 M 被保留
-
然后只判断最后一个 M 是否为质数
以下是借鉴的另一种方法:
python
N = int(input())
for _ in range(N):
M = int(input())
# 对当前的 M 判断是否为素数
a = False # 假设不是素数
if M <= 1:
a = False
elif M <= 3:
a = True # 2和3是素数
elif M % 2 == 0 or M % 3 == 0:
a = False
else:
a = True # 先假设是素数
for r in range(5, int(M**0.5) + 1, 6):
if M % r == 0 or M % (r+2) == 0:
a = False
break
# 根据 a 的值输出结果
if a:
print("Yes")
else:
print("No")
第二次需要进行对a进行再次假设,因为:
-
进入 else 分支时,a 的值不确定(可能是上一轮的值)
-
需要给这个新的 M 一个初始假设值
-
然后通过循环验证这个假设是否正确
第二次假设不能是 False,因为:
-
初始假设为 False 的话,素数无法被正确识别
-
循环只能把 False 改成 False(找到因数时),无法把 False 改成 True
-
正确的逻辑是:先假设是素数,然后找反证(找到因数就推翻假设)