python while循环
请教大神,这样的代码为啥不对啊?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
您好,根据您给出的代码,问题出在第二个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 能问下大神为啥是 while x * x <= n吗? 大大大大力无限 发表于 2023-4-8 12:24
能问下大神为啥是 while x * x
数学原理。
一个数A的所有除1和它本身之外,所有因数都小于
sqrt(A) 本帖最后由 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
大大大大力无限 发表于 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是否为素数,从而提高代码的运行效率。
页:
[1]