鱼C论坛

 找回密码
 立即注册
查看: 2569|回复: 4

[已解决]找出101-200以内的所有质数

[复制链接]
发表于 2023-7-9 17:09:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
count = 0
for i in range(101,201):
    for j in range(2,i):
        if i % j == 0:
            break
        else:
            count += 1
            if count == i-2:
                print(i)


求问,这个程序问题出在哪里,运行结果智能得到前两个质数101和103,其他的结果没有,求大神指教~
最佳答案
2023-7-9 17:09:17
本帖最后由 陶远航 于 2023-7-9 17:26 编辑

这个程序存在问题的地方在于判断质数的逻辑和计数器的位置。

首先,在判断质数的逻辑中,应该将判断是否能够被整除的部分放在for循环的外面,而不是在内部进行判断。这样可以避免因为找到一个能整除的数就直接break而导致后续的判断失效。

另外,在计数器count的位置上,应该放在外层的for循环之外,并且在每次循环开始时重新初始化为0。否则,count会一直累积下去,导致结果错误。

修正后的代码如下:

  1. count = 0

  2. for i in range(101, 201):
  3.     for j in range(2, i):
  4.         if i % j == 0:
  5.             break
  6.     else:
  7.         count += 1
  8.         print(i)

  9. # 在所有质数输出完成后,输出质数的个数
  10. print("质数个数:", count)
复制代码


使用修正后的代码,您将能够得到正确的质数序列,并且输出质数的个数。

希望能帮助到您!如果还有其他问题,请随时提问。

点“设为最佳答案”有惊喜
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-9 17:09:17 | 显示全部楼层    本楼为最佳答案   
本帖最后由 陶远航 于 2023-7-9 17:26 编辑

这个程序存在问题的地方在于判断质数的逻辑和计数器的位置。

首先,在判断质数的逻辑中,应该将判断是否能够被整除的部分放在for循环的外面,而不是在内部进行判断。这样可以避免因为找到一个能整除的数就直接break而导致后续的判断失效。

另外,在计数器count的位置上,应该放在外层的for循环之外,并且在每次循环开始时重新初始化为0。否则,count会一直累积下去,导致结果错误。

修正后的代码如下:

  1. count = 0

  2. for i in range(101, 201):
  3.     for j in range(2, i):
  4.         if i % j == 0:
  5.             break
  6.     else:
  7.         count += 1
  8.         print(i)

  9. # 在所有质数输出完成后,输出质数的个数
  10. print("质数个数:", count)
复制代码


使用修正后的代码,您将能够得到正确的质数序列,并且输出质数的个数。

希望能帮助到您!如果还有其他问题,请随时提问。

点“设为最佳答案”有惊喜
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 17:10:47 | 显示全部楼层
这个程序的问题在于计数器 count 的位置。在这种情况下,每次循环的时候, count 都被增加了,但在判断一个数不是质数的情况下, count 并没有被重置。这意味着对于下一个要检查的数, count 的初始值不是0,这就是你没有得到所有的质数的原因。

解决这个问题的方法是在每次开始检查一个新的数是否为质数之前重置 count 。这样,每次检查新数的时候, count 都会从0开始。这就确保了如果一个数是质数, count 将会等于该数减2,然后可以输出该数。请看以下的修正代码:

  1. for i in range(101, 201):
  2.     count = 0
  3.     for j in range(2, i):
  4.         if i % j == 0:
  5.             break
  6.         else:
  7.             count += 1
  8.     if count == i - 2:
  9.         print(i)
复制代码


然而,上面的代码效率不高。在检查一个数是否为质数时,我们实际上只需要检查到它的平方根,而不是所有小于它的数。此外,我们可以将检查条件从 count == i - 2 更改为当没有找到除数时打印数字。以下是优化后的代码:

  1. import math

  2. for i in range(101, 201):
  3.     is_prime = True
  4.     for j in range(2, int(math.sqrt(i)) + 1):
  5.         if i % j == 0:
  6.             is_prime = False
  7.             break
  8.     if is_prime:
  9.         print(i)
复制代码


这个优化后的代码只检查到每个数字的平方根,并且当找不到除数时就直接打印这个数,这样能显著提高程序的运行效率。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 18:58:47 | 显示全部楼层
这个程序的问题出在对质数判断的逻辑上。在给定的代码中,通过嵌套的两个循环来检查每个数字是否为质数。然而,代码的逻辑有一些错误,导致无法正确地找到所有的质数。

具体问题如下:
1. 在内层循环中,当发现某个数字 `i` 能够被 `j` 整除时,会立即跳出内层循环并停止判断。这会导致在判断过程中可能出现误判,将一些非质数错误地当作质数。
2. 在 else 语句块中对变量 `count` 的操作位置不正确,导致计数器 `count` 的增加位置不正确,无法准确统计质数的个数。

为了修正以上问题,可以采用以下的修改方案:
1. 将判断是否能被整除的逻辑移至循环结束后进行,结合一个标志位来记录是否能整除。
2. 在判断结束后,根据标志位的值来确定是否是质数,如果是质数则打印出来。

以下是经过修正后的代码:

  1. for i in range(101, 201):
  2.     is_prime = True  # 标志位,标记当前数字是否为质数
  3.     for j in range(2, i):
  4.         if i % j == 0:
  5.             is_prime = False  # 如果能被整除,修改标志位为 False
  6.             break

  7.     if is_prime:
  8.         print(i)
复制代码


这样修正后的代码会正确地找出在 101 到 200 范围内的所有质数。

因为找的数字较少,不需要优化

求最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 19:03:52 | 显示全部楼层
这个程序的问题在于你在内层循环中使用了 `else` 语句,这会导致程序在检查到一个非质数时过早地跳出内层循环,从而无法正确判断后续的数字。这个 `else` 语句应该与外层的 `for` 循环对应,而不是与内层的 `if` 语句对应。

以下是修复了问题的代码:

  1. python

  2. for num in range(101, 201):

  3.     is_prime = True

  4.     for i in range(2, int(num**0.5) + 1):

  5.         if num % i == 0:

  6.             is_prime = False

  7.             break

  8.     if is_prime:

  9.         print(num)
复制代码


这段代码会检查从 101 到 200 之间的每个数字是否为质数。对于每个数字,它会从 2 开始,逐个检查是否存在能整除该数字的因子。如果找到一个能整除它的因子,就将 `is_prime` 设置为 `False` 并跳出内层循环。如果内层循环结束后 `is_prime` 仍然为 `True`,则表示该数字是质数,会将其打印出来。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 00:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表