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

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

python质数求和代码 python求质数个数_python 找质数的个数

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

质数,就是除了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,"是质数")

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

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

python质数求和代码 python求质数个数_数组_02

问题一:很明显,如果输入的数字是“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,"不是质数")

程序运行后,在输入较大的数字时,运行的效率还是有提升的。讲完这些,想到了一道以前程序竞赛的题目:

输入一串数字,请判断出其中有多少个质数。这又该如何解决呢?


python质数求和代码 python求质数个数_python 找质数的个数_03

很明显,这里的实质问题还是要判断输入的一串数字里面,每个数字是不是质数,然后还需要计数。因此,判断质数的程序已经实现了,接下去是要解决输入一串数字,然后逐个判断,以及如何计数的问题。数字需要一个一个放进去检验,然后出来一个结果,很容易想到使用一个函数定义的形式。这里我们定义了一个叫做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函数,只跟他讲了一下大概,能够看懂这个程序就可以了。大功告成!