python 找质数的个数_用Python判断质数的尝试

周末开始Python的循环语句学习,于是就想到了一个经典的问题,寻找质数。这是第一次宝少用程序来解决实际的应用问题,看看会有什么结果。

我们的目标是:输入一个数字之后,让计算机判断它是不是质数。

61c0659b5f7d392827ed8ec6aa9356a1.png

抛出问题后,首先需要解决,什么是质数的问题。与纯数学的想法不同,我们需要找到一个可以让计算机接受的判定的法则。

质数,就是除了1以及本身以外,没有其他因数的自然数。首先它是个自然数,因此程序的输入端就解决了,N=int(input())。

重要的是判定的法则,没有其他因数又可以表述成什么呢?于是,要从简单的数字举例开始。问如何判定117是不是质数呢?我们会考虑分解117。

分解的过程其实是将这个数逐个地去试验性除以2、3、5、……,只要能被整除,那么就不是质数,如果一直找不到可以整除的数,那么就是质数。

于是,写出代码如下:

N=int(input())for i in range (2,N):if N % i ==0:print(N,"不是质数")breakelse:print(N,"是质数")

运行结果正常,好像能够判断输入的数字了。

那么这里有什么可以改进的地方呢?

d6086bbf14a08200259db59629c64985.png

问题一:很明显,如果输入的数字是“1”的话,这个程序会输出:1是质数。因此可以在前面进行输入数字的判断。

问题二:在数学上,进行质数判断的计算,不会一直算到N-1这个数,只会算到N/2。因为除“1”以外,2是最小的因子了。

如果N,能够找到大于N/2的因子的话,那么另外一个因子就会小于2,这是不可能存在的。因此在循环的时候,我们计算到N/2就够了,在程序运行上讲,可以节省很大的运行时间。这在程序设计上是非常必要的。

通过这两个分析,改进程序如下:

N=int(input())if N>1:for i in range (2,N//2+1):if N % i ==0:print(N,"不是质数")break    else:print(N,"是质数")else:print(N,"不是质数")
程序运行后,在输入较大的数字时,运行的效率还是有提升的。讲完这些,想到了一道以前程序竞赛的题目: 输入一串数字,请判断出其中有多少个质数。这又该如何解决呢?

f8c1e0be1a5b7f9c0b81797787a2ddaf.png

很明显,这里的实质问题还是要判断输入的一串数字里面,每个数字是不是质数,然后还需要计数。因此,判断质数的程序已经实现了,接下去是要解决输入一串数字,然后逐个判断,以及如何计数的问题。数字需要一个一个放进去检验,然后出来一个结果,很容易想到使用一个函数定义的形式。这里我们定义了一个叫做judge的函数,判断是否是质数,如果是质数,就把标记flag标记为“1”,不是则标记为“0”。同时,这样也可以方便后面进行计数。然后整体的调用逻辑就如下表示:
def judge(Num):if Num > 1:for i in range(2, Num // 2 + 1):if Num % i == 0:
flag=0 break else:
flag=1 else:
flag=0 return flag
N=int(input())
count=0count=count+judge(N)print("总共有",count," 个质数")
但是很明显,这里只能输入一个数字,那么如何进行多个数字的输入呢?或者如何输入一行用空格分隔的数字,再进行判断有几个质数呢?要存入一串数字,很容易想到使用数组的概念。因为在scratch里接触过列表,所以这个还比较容易理解。然后,因为有空格,我们需要用split函数进行分割。
a=input()
N=[int(n) for n in a.split()]
l=len(N)
count=0for i in range (l):
count=count+judge(N[i])print("总共有",count," 个质数")
这里涉及到后续数组的知识,以及split函数,只跟他讲了一下大概,能够看懂这个程序就可以了。大功告成!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值