鱼C论坛

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

[已解决]20以内合数的所有因数全部被打印

[复制链接]
发表于 2020-12-21 13:39:40 | 显示全部楼层 |阅读模式

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

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

x
以下内容是第17节课最后一道动手题的答案。因为10以内的整数最多只有两个因数。例如10=2*5.因此最终打印的结果里面,看不出有什么问题。


  1. n = 2
  2. while n < 10:
  3.     x = 2
  4.     while x < n:
  5.         if n % x ==0:
  6.             print(n,'=',x,'*',n//x)
  7.             break
  8.         x += 1
  9.     else:
  10.         print(n,'是一个素数。')
  11.     n +=1
复制代码


但是如果把n的范围限定在20,那么就会有如下问题:

16 = 2*8

这个结果打印出来了。

然而16=4*4

这个结果却没有。

如果我希望最终打印的结果里面,是可以同时包含16=2*8和16=4*4的,那么代码应该如何修改呢?
最佳答案
2020-12-22 00:07:39
阿你爸爸 发表于 2020-12-21 22:17
这带来了新的问题。

这段代码判断一个数是不是素数,本质上是让n除以x,x∈{2 , n-1},如果不能整除, ...

稍微改了一下,看一下还有问题没?
  1. n = 2
  2. while n < 29:
  3.     x = 2
  4.     while x < n:
  5.         if n % x == 0:
  6.             if x > n / x:
  7.                 break
  8.             if x == n / x:
  9.                 print(n, '=', x, '*', n // x)
  10.                 break
  11.             print(n, '=', x, '*', n // x)
  12.         x += 1
  13.     else:
  14.         print(n, '是一个素数。')
  15.     n += 1
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-21 13:47:41 | 显示全部楼层
本帖最后由 qq1151985918 于 2020-12-21 14:31 编辑

抱歉刚刚的是错误的,楼下的是正确的,但是他的在n==4的时候有点小瑕疵单独拿出来就好了,还是他写的正确。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-21 13:55:27 | 显示全部楼层
本帖最后由 情绪z 于 2020-12-21 13:56 编辑

加一层判断,x 大于 n / x 时在停止
  1. n = 2
  2. while n < 20:
  3.     x = 2
  4.     while x < n:
  5.         if n % x == 0:
  6.             if x > n / x:
  7.                 break
  8.             print(n, '=', x, '*', n // x)
  9.         x += 1
  10.     else:
  11.         print(n, '是一个素数。')
  12.     n += 1
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-21 22:17:20 | 显示全部楼层
情绪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是一个素数。”

看懂了,但想不出如何改。╮(╯▽╰)╭
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 00:07:39 | 显示全部楼层    本楼为最佳答案   
阿你爸爸 发表于 2020-12-21 22:17
这带来了新的问题。

这段代码判断一个数是不是素数,本质上是让n除以x,x∈{2 , n-1},如果不能整除, ...

稍微改了一下,看一下还有问题没?
  1. n = 2
  2. while n < 29:
  3.     x = 2
  4.     while x < n:
  5.         if n % x == 0:
  6.             if x > n / x:
  7.                 break
  8.             if x == n / x:
  9.                 print(n, '=', x, '*', n // x)
  10.                 break
  11.             print(n, '=', x, '*', n // x)
  12.         x += 1
  13.     else:
  14.         print(n, '是一个素数。')
  15.     n += 1
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-22 14:13:03 | 显示全部楼层
情绪z 发表于 2020-12-22 00:07
稍微改了一下,看一下还有问题没?

非常感谢,可以了。

在思路上得到了很大的启发。相当于是外层的while循环,控制n的取值范围,内层的while实现n/x,x+=1.内层while里面的第一层if是判断n/x能否整除(n是否为合数),里面平行的两个第二层if是解决不重复打印,以及两个因子相等这两种特殊情况的。

总结一下就是,分层考虑问题,先考虑整体的逻辑,然后通过内部的if判断,解决特殊情况下的逻辑。大佬,学到了~O(∩_∩)O哈哈~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-2-23 02:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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