4-11判断素数

因为在之前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")

代码的逻辑错误在于缩进和循环的位置

  1. 先读入 N

  2. 循环 N 次,每次读入一个 M,但每次都覆盖掉之前的 M

  3. 循环结束后,只有最后一个输入的 M 被保留

  4. 然后只判断最后一个 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进行再次假设,因为:

  1. 进入 else 分支时,a 的值不确定(可能是上一轮的值)

  2. 需要给这个新的 M 一个初始假设值

  3. 然后通过循环验证这个假设是否正确

第二次假设不能是 False,因为:

  • 初始假设为 False 的话,素数无法被正确识别

  • 循环只能把 False 改成 False(找到因数时),无法把 False 改成 True

  • 正确的逻辑是:先假设是素数,然后找反证(找到因数就推翻假设)

相关推荐
@PHARAOH2 分钟前
WHAT - cursor cli 开发范式
前端·ai·ai编程
forEverPlume1 小时前
PHP怎么使用Eloquent Attribute Composition属性组合_Laravel通过组合构建复杂属性【方法】
jvm·数据库·python
Aleeeeex1 小时前
RAG 那点事:从 8 份企业文档到能用的问答系统,全过程拆给你看
人工智能·python·ai编程
子兮曰1 小时前
深入 HTML-in-Canvas:当 Canvas 学会了渲染 DOM,前端图形生态要变天了
前端·javascript·canvas
2301_809204701 小时前
mysql在docker容器中如何部署_利用docker-compose快速启动
jvm·数据库·python
ws_qy1 小时前
从大模型原理到前端 AI Coding 工程化实践
前端·ai编程
倾颜1 小时前
React 19 源码主线拆解 04:Fiber 到底是什么,React 为什么需要 Fiber?
前端·react.js·源码阅读
AI攻城狮1 小时前
国产大模型能力大比拼,社区有话说
前端
_深海凉_2 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
2301_800976932 小时前
正则表达式
开发语言·python·正则表达式