20以内合数的所有因数全部被打印
以下内容是第17节课最后一道动手题的答案。因为10以内的整数最多只有两个因数。例如10=2*5.因此最终打印的结果里面,看不出有什么问题。n = 2
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
但是如果把n的范围限定在20,那么就会有如下问题:
16 = 2*8
这个结果打印出来了。
然而16=4*4
这个结果却没有。
如果我希望最终打印的结果里面,是可以同时包含16=2*8和16=4*4的,那么代码应该如何修改呢? 本帖最后由 qq1151985918 于 2020-12-21 14:31 编辑
抱歉刚刚的是错误的,楼下的是正确的,但是他的在n==4的时候有点小瑕疵单独拿出来就好了,还是他写的正确。 本帖最后由 情绪z 于 2020-12-21 13:56 编辑
加一层判断,x 大于 n / x 时在停止
n = 2
while n < 20:
x = 2
while x < n:
if n % x == 0:
if x > n / x:
break
print(n, '=', x, '*', n // x)
x += 1
else:
print(n, '是一个素数。')
n += 1
情绪z 发表于 2020-12-21 13:55
加一层判断,x 大于 n / x 时在停止
这带来了新的问题。
这段代码判断一个数是不是素数,本质上是让n除以x,x∈{2 , n-1},如果不能整除,则判断其为素数。小甲鱼提供的答案是只要出现一个可以被n整除的x,则break,并打印这个等式。而你的答案是让x比n/x大才退出,即不打印重复的等式,例如16=2*8可以打印,但16=8*2则没必要打印。
但这带来的新问题就是,当x=n/x时,程序不能break,因此x要继续+1,如果(n/2,n)这个区间里不存在n%x==0,则会一直执行到n/(n-1),且打印“n是一个素数。”
看懂了,但想不出如何改。╮(╯▽╰)╭ 阿你爸爸 发表于 2020-12-21 22:17
这带来了新的问题。
这段代码判断一个数是不是素数,本质上是让n除以x,x∈{2 , n-1},如果不能整除, ...
稍微改了一下,看一下还有问题没?
n = 2
while n < 29:
x = 2
while x < n:
if n % x == 0:
if x > n / x:
break
if x == n / x:
print(n, '=', x, '*', n // x)
break
print(n, '=', x, '*', n // x)
x += 1
else:
print(n, '是一个素数。')
n += 1
情绪z 发表于 2020-12-22 00:07
稍微改了一下,看一下还有问题没?
非常感谢,可以了。
在思路上得到了很大的启发。相当于是外层的while循环,控制n的取值范围,内层的while实现n/x,x+=1.内层while里面的第一层if是判断n/x能否整除(n是否为合数),里面平行的两个第二层if是解决不重复打印,以及两个因子相等这两种特殊情况的。
总结一下就是,分层考虑问题,先考虑整体的逻辑,然后通过内部的if判断,解决特殊情况下的逻辑。大佬,学到了~O(∩_∩)O哈哈~
页:
[1]