|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 jcpython2 于 2022-9-25 17:22 编辑
- def isprime(n):
- if n <= 1 or n % 2 == 0 and n !=2: #负数或者同时满足不是2而且还%0则非质数
- return False
- elif n ==2: #2为质数
- return True
- else:
- for i in range(3,n,2):
- if n % i == 0:
- return False
- if i * i > n:
- break
- return True
- for i in range(int(input())):
- if(isprime(i)):
- print(i,end=" ")
复制代码
看不懂以下这段
- for i in range(3,n,2):
- if n % i == 0:
- return False
- if i * i > n:
- break
复制代码
如果代入n为3那么 n % i == 0 也就是 3% 3 == 0是成立的但成立后返回了false,实际结果返回true
i * i > n
这段完全不懂作用
以下是我排查弄懂添加了的代码,但还是不懂
- def isprime(n):
- if n <= 1 or n % 2 == 0 and n !=2: #负数或者同时满足不是2而且还%0则非质数
- print(n,'触发条件1')
- return False
- elif n ==2: #2为质数
- print(n,'满足条件2')
- return True
- else:
- print('n:',n,'进入条件三')
- for i in range(3,n,2):
- print('条件3-1 i&n:',i,n)
- if n % i == 0:
- print('触发条件3-1,n%i==0',n,i)
- return False
- if i * i > n:
- print('触发条件3-2')
- break
- print(n,'不满足条件123,返回true')
- return True
- for i in range(int(input())):
- if(isprime(i)):
- print(i,end=" ")
复制代码
- 5
- 0 触发条件1
- 1 触发条件1
- 2 满足条件2
- 2 n: 3 进入条件三
- 3 不满足条件123,返回true
- 3 4 触发条件1
复制代码
我预期中n循环到3后会触发 n % i ==0但结果并未触发
本帖最后由 jackz007 于 2022-9-25 18:24 编辑
- def isprime(n) :
- r = False # n 缺省不是素数
- if n > 1:
- if n % 2 and n % 3 and n % 5 and n % 7: # 如果 n 不能同时被 2、3、5、7 整除,满足条件的 n 至少是 11
- i , r = 3 , True # 假定 n 是素数,i 从 3 开始枚举 n 的可能因子
- while i * i < n + 1: # i 的枚举范围是 3 ~ sqrt(n)
- if n % i == 0: # 找到了因子
- r = False # 否定之前 n 是素数的假设
- break # 结束循环
- i += 2 # i 以 2 为步长继续枚举
- elif n == 2 or n == 3 or n == 5 or n == 7: # 如果 n 就是 2、3、5、7 本身,那么,不用计算,它肯定就是素数
- r = True
- return r
- c = 0
- for i in range(int(input())):
- if(isprime(i)):
- if c:
- print('\t' , end = '' , sep = '')
- print(i , end = ' ' , sep = '')
- c += 1
复制代码
运行实况:
- D:\[00.Exerciese.2022]\Python>python x.py
- 100
- 2 3 5 7 11 13 17 19 23 29
- 31 37 41 43 47 53 59 61 67 71
- 73 79 83 89 97
- D:\[00.Exerciese.2022]\Python>
复制代码
当然,isprime() 也可以这样来定义:
- def isprime(n) :
- r = False
- if n > 1:
- for i in range(3 , n , 2): # i 的枚举范围 3 ~ n - 1
- if n % i == 0:
- break
- else:
- r = True
- return r
复制代码
与前面的代码相比,结果相同,但是,效率可能要低一些
|
|