Python质数判断的几个小例子

本文提供了四种不同的算法来判断数字是否为质数,并列举了0到100、100到200范围内所有质数的实例代码。通过迭代检查因数的方法,实现了基本的质数筛选逻辑。

1.判断一个数字是不是质数

num=10
for i in range(2,num):
    if num%i==0:
        print("%s不是一个质数"%num)
        break
else:
    print("%s是一个质数"%num)

2.判断0到100内的素数

l=[]
for i in range(2,101):
    for j in range(2,i):
        if i%j==0:
            break
    else:
        l.append(i)
​
print(len(l))

3.判断100到200之间的素数包括100,200

i=100
list=[]
while i<=200:
    j=2
    while j<i:
        if i%j==0:
            break
        j+=1
    else:
        list.append(i)
    i+=1
print(list)
print(len(list))

4.质数判断升级版

i=100
list=[]
while i<=200:
    j=2
    flag=True
    while j<i:
        if i%j==0:
            flag=False
            break
        j+=1
    if flag:
        list.append(i)
    i+=1
print(list)
print(len(list))
<think>嗯,用户想要一个判断素数和合数的Python代码。首先,我得回忆一下素数的定义。素数是指大于1的自然数,除了1和它本身外没有其他因数。合数则是大于1且有其他因数的数,所以除了素数和1之外都是合数。不过,通常1不被视为素数或合数,所以代码里需要处理这种情况。 接下来,我需要想如何判断一个数是否为素数。常见的方法是试除法,即检查从2到该数的平方根之间的所有整数是否能整除它。如果找到任何能整除的数,那这个数就是合数;否则就是素数。平方根是因为如果有一个因数大于平方根,那么必定有一个对应的因数小于平方根,所以不需要检查更大的数。 那代码的结构应该是怎样的呢?函数应该接受一个整数n,返回它是素数还是合数。首先处理n小于等于1的情况,直接返回不是素数也不是合数,或者提示错误。然后处理2的情况,因为2是唯一的偶数素数。接着检查是否能被2整除,排除其他偶数。之后从3开始,每次加2,只检查奇数,直到sqrt(n)。这里需要注意,sqrt(n)整数部分,可以用int(math.sqrt(n)) + 1,这样循环到平方根的整数部分即可。 然后要考虑输入的验证,确保用户输入的是正整数。否则,比如输入0、负数或者非整数,程序应该给出错误提示。这里可以用try-except块来捕获输入错误。 另外,用户可能希望同时判断素数和合数,所以函数可以返回一个结果,比如返回“素数”或“合数”,或者在输入无效时提示错误。主程序部分可能需要一个循环,让用户可以多次输入,直到选择退出。 在写代码的时候,还需要注意效率问题。比如,当n很大时,试除法可能比较慢,但对于教学示例来说,应该足够。用户可能需要的是一个简单易懂的示例,而不是最优化的算法,所以暂时不用考虑更高级的算法如米勒-拉宾测试等。 测试几个例子,比如输入7应该返回素数,9返回合数,1则提示错误,负数也提示错误。这样确保代码的正确性。 总结步骤: 1. 导入math模块以计算平方根。 2. 定义判断函数is_prime,处理边界情况(n<=1)。 3. 处理偶数的情况,减少循环次数。 4. 循环检查3到sqrt(n)之间的奇数。 5. 主程序部分获用户输入,验证是否为有效整数,调用函数并输出结果。 6. 添加循环让用户可以多次测试。 可能遇到的问题:输入非整数类型,比如字符串,会导致ValueError,所以需要用try-except来捕获。另外,当n是2时,应该正确处理为素数,不需要进入循环。对于较大的数,比如1000000,可能需要较长时间,但作为示例代码,可以接受。 现在把这些思路转化成代码,确保语法正确,注释清晰,方便用户理解。</think>以下是一个判断素数/合数的Python代码实现,并附带详细解释: ```python import math def is_prime(n): """判断一个正整数是否为素数""" if n <= 1: return "既不是素数也不是合数" if n == 2: # 2是唯一的偶数素数 return "素数" if n % 2 == 0: # 排除其他偶数 return "合数" # 只需检查到平方根的奇数因子 max_divisor = math.isqrt(n) + 1 for d in range(3, max_divisor, 2): if n % d == 0: return "合数" return "素数" # 主程序 while True: try: num = int(input("请输入一个正整数(输入0退出): ")) if num == 0: print("程序已退出") break result = is_prime(num) print(f"{num} 是{result}") except ValueError: print("错误:请输入有效的正整数!") ``` **代码解析**(使用$$...$$格式独立公式): $$ \begin{aligned} 1. &\ \text{数学原理:} \\ &\ \text{素数判定定理:若 } n > 1 \text{ 不能被 } 2 \leq d \leq \sqrt{n} \text{ 整除,则 } n \text{ 是素数} \\ &\ \text{时间复杂度:} O(\sqrt{n}) \\ 2. &\ \text{优化策略:} \\ &\ \text{• 排除所有偶数(除2)} \\ &\ \text{• 只需检查奇数因子} \\ &\ \text{• 使用平方根减少循环次数} \\ \end{aligned} $$ **执行示例**: ``` 请输入一个正整数(输入0退出): 17 17 是素数 请输入一个正整数(输入0退出): 9 9 是合数 请输入一个正整数(输入0退出): 1 1 是既不是素数也不是合数 请输入一个正整数(输入0退出): 0 程序已退出 ``` **关键点说明**: 1. `math.isqrt()` 比 `int(math.sqrt())` 更高效准确 2. 对数字2的特殊处理(唯一偶素数) 3. 输入验证机制防止非数字输入 4. 使用步长2跳过偶数检查 5. 合理处理边界条件(n ≤ 1的情况) 这个代码可以正确处理: - 大数(如 999999937) - 边界值(0, 1, 2) - 负数输入(会被捕获为无效输入) - 非数字输入(触发异常处理) 如果需要进一步提高效率,可以考虑预先计算素数表或使用概率性素数测试算法(如Miller-Rabin),但对一般应用来说,这个实现已经足够高效可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值