鱼C论坛

 找回密码
 立即注册
查看: 2735|回复: 9

书上一个例子求教

[复制链接]
发表于 2017-2-8 10:09:34 | 显示全部楼层 |阅读模式

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

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

x
x=(int(input('输入一个开始值:')),int(input('输入一个结束值:')))
x1=min(x)
x2=max(x)
for n in range(x1,x2+1):
        for i in range(2,n-1):
                if n % i == 0:
                        break
        else:
                print(n,'是素数。')


这是21天学通python上的一个例子,for i in range(2,n-1):  这里为什么是 n-1 ,我是想不明白,不是应该用 n 吗???
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-2-8 10:21:43 | 显示全部楼层
如果用n就是自身除以自身了,所有数字都判断不是质数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-8 10:39:32 | 显示全部楼层
试验了一下此处把n-1改成n也是没有错的,但是结果会出现1,百度出来1不是素数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-8 10:40:08 | 显示全部楼层
小Q学Python 发表于 2017-2-8 10:21
如果用n就是自身除以自身了,所有数字都判断不是质数

(2,n-1)右边是开区间,是不会除于其本身的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-8 11:05:54 | 显示全部楼层
我觉得应该是差别不大。n和n-1都行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-8 11:22:21 | 显示全部楼层
试了结果都是一样的。我就是不明白他为什么要 -1。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-8 11:35:52 | 显示全部楼层
首先,你要知道range()函数不含右端点的值,这个可以查看help(range)的说明
  1. In [1]: range?
  2. Init signature: range(self, /, *args, **kwargs)
  3. Docstring:     
  4. range(stop) -> range object
  5. range(start, stop[, step]) -> range object

  6. Return an object that produces a sequence of integers from start (inclusive)
  7. to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
  8. start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
  9. These are exactly the valid indices for a list of 4 elements.
  10. When step is given, it specifies the increment (or decrement).
  11. Type:           type

  12. In [2]: x = range(0,10)

  13. In [3]: list(x)
  14. Out[3]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
复制代码

上面这个简单的例子就可以看出来,所以不会出现n对自身取模的情况

但是为什么例子里用了range(2, n-1),这个涉及到一点简单的数论知识和相关的算法
其实,任意2个相邻的自然数i, i+1都是互质的(i=1,2,3,……),因此事实上我们根本不需要去判断n%(n-1)
我们甚至不需要遍历所有比n小的数来判断一个数是否为素数,只需要判断到math.sqrt(n)或者n**0.5即可,而且不必以1为步长进行检测,只要试验所有小于n**0.5的素数能否整除n即可。

就算法的角度而言,这个例子给出的代码显然是低效的,但作为简单的例子也不是不可以。至于n=1的情况,这段代码明显没有单独考虑边界条件。这涉及到代码的健壮性(robustness),因为在范围输入控制时,程序没有限制用户可以输入那些值,不过扯开去就没底了。作为一个简单例子的代码片段,这已经可以了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-2-8 11:48:05 | 显示全部楼层
DarkmasterSugar 发表于 2017-2-8 11:35
首先,你要知道range()函数不含右端点的值,这个可以查看help(range)的说明

上面这个简单的例子就可以看 ...

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

使用道具 举报

发表于 2017-2-9 11:15:09 | 显示全部楼层
确实我弄错了。没差别的。
其实只需要比较到自身数字**0.5+1就可以了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-9 13:01:01 | 显示全部楼层
确实我弄错了。没差别的。
其实只需要比较到自身数字**0.5+1就可以了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-25 08:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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