鱼C论坛

 找回密码
 立即注册
查看: 2432|回复: 5

[已解决]python while循环

[复制链接]
发表于 2023-4-8 12:08:17 | 显示全部楼层 |阅读模式

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

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

x
请教大神,这样的代码为啥不对啊?
n = 1

while n < 10:
    x = 1
    while x < n:
        
        if n % x == 0:
            print(n, '=', '*', n // x)
            break
        x += 1
    else:
        print(n, '是一个素数')
    n += 1

出来的结果是这样的:
1 是一个素数
2 = * 2
3 = * 3
4 = * 4
5 = * 5
6 = * 6
7 = * 7
8 = * 8
9 = * 9
最佳答案
2023-4-8 13:57:19
本帖最后由 andy大宝 于 2023-4-8 19:16 编辑

我将代码的修改步骤分成了三步,希望有助于您理解
1.首先,您希望打印出 a = b * c 的格式,显然 print() 处漏掉了一些需要打印的内容:
n = 1

while n < 10:
    x = 1
    while x < n:
        
        if n % x == 0:
            print(n, '=', x, '*', n // x)          #第一步
            break
        x += 1
    else:
        print(n, '是一个素数')
    n += 1
2.进一步观察,发现 2~9 输出结果的第一个奇数都为 1,因此您需要将开始判断的数字设为 2:
n = 1

while n < 10:
    x = 2          #第二步
    while x < n:
        
        if n % x == 0:
            print(n, '=', x, '*', n // x) 
            break
        x += 1
    else:
        print(n, '是一个素数')
    n += 1
3.最后,1 是一个特殊情况,需要单独拉出来看:
n = 2                
print('1 不是一个素数')          #第三步

while n < 10:
    x = 2 
    while x < n:
        
        if n % x == 0:
            print(n, '=', x, '*', n // x) 
            break
        x += 1
    else:
        print(n, '是一个素数')
    n += 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-8 12:10:30 | 显示全部楼层
您好,根据您给出的代码,问题出在第二个while循环的条件。

您需要将 while x < n: 改成 while x * x <= n:。另外,需要注意的是,1不是素数,所以我们需要对1进行特殊处理。

这是修复后的代码:
n = 1

while n < 10:
    if n == 1:
        print(n, '不是一个素数')
    else:
        x = 2
        while x * x <= n:
            if n % x == 0:
                print(n, '=', x, '*', n // x)
                break
            x += 1
        else:
            print(n, '是一个素数')
    n += 1

输出结果:
1 不是一个素数
2 是一个素数
3 是一个素数
4 = 2 * 2
5 是一个素数
6 = 2 * 3
7 是一个素数
8 = 2 * 4
9 = 3 * 3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-8 12:24:14 | 显示全部楼层
能问下大神为啥是 while x * x <= n吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-8 13:34:35 | 显示全部楼层
大大大大力无限 发表于 2023-4-8 12:24
能问下大神为啥是 while x * x


数学原理。
一个数A的所有除1和它本身之外,所有因数都小于
sqrt(A)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-8 13:57:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 andy大宝 于 2023-4-8 19:16 编辑

我将代码的修改步骤分成了三步,希望有助于您理解
1.首先,您希望打印出 a = b * c 的格式,显然 print() 处漏掉了一些需要打印的内容:
n = 1

while n < 10:
    x = 1
    while x < n:
        
        if n % x == 0:
            print(n, '=', x, '*', n // x)          #第一步
            break
        x += 1
    else:
        print(n, '是一个素数')
    n += 1
2.进一步观察,发现 2~9 输出结果的第一个奇数都为 1,因此您需要将开始判断的数字设为 2:
n = 1

while n < 10:
    x = 2          #第二步
    while x < n:
        
        if n % x == 0:
            print(n, '=', x, '*', n // x) 
            break
        x += 1
    else:
        print(n, '是一个素数')
    n += 1
3.最后,1 是一个特殊情况,需要单独拉出来看:
n = 2                
print('1 不是一个素数')          #第三步

while n < 10:
    x = 2 
    while x < n:
        
        if n % x == 0:
            print(n, '=', x, '*', n // x) 
            break
        x += 1
    else:
        print(n, '是一个素数')
    n += 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-8 14:07:50 | 显示全部楼层
大大大大力无限 发表于 2023-4-8 12:24
能问下大神为啥是 while x * x

在判断一个数n是否为素数时,我们需要检查n是否只有两个不同的因数:1和n本身。

为了检查这一点,我们需要检查n是否可以被介于1和n之间的任何数整除。

但实际上,我们不需要检查所有这些数,只需要检查一部分即可。

原因如下:

  • 如果n能够被一个大于1且小于n的数整除,那么这个数(我们称之为x)必定有一个对应的因数y(y = n // x),使得 n = x * y。
  • 对于x和y,一个必定小于等于n的平方根,另一个必定大于等于n的平方根。因为如果x和y都大于n的平方根,那么x * y > n;同理,如果x和y都小于n的平方根,那么x * y < n。这与我们的前提n = x * y相矛盾。

因此,我们只需要检查x是否小于等于n的平方根,即 x * x <= n。这样,我们就可以在检查更少的数的情况下确定n是否为素数,从而提高代码的运行效率。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 20:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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