Featured image of post Python学习日记 – 素数判断

Python学习日记 – 素数判断

前言

对于一个数是否为素数,常规的方法就是 2、5、7、11、13、17 来试验,可是这样的方法仅在 1000 以下的数有较高正确率,就在想,有没有一种绝对正确并且不使用 Python 其它模块的方法来判断素数,毕竟有了 Python 数学模块,素数的判断就变得很简单了,但是引入一个数学模块似乎会有些多余了。

常规算法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
print("素数的概念是只可以被1和它本身整除的数字。\n欢迎来到这里,我们将在这里计算你所输入的数字是否为素数。")
while True:
    number = input("输入你的数字吧:")
    number = int(number)
    if number == 2:
        print("是素数")
    elif number == 3:
        print("是素数")
    elif number == 5:
        print("是素数")
    elif number == 7:
        print("是素数")
    elif number == 11:
        print("是素数")
    elif number == 17:
        print("是素数")
    elif number == 13:
        print("是素数")
    elif number == 19:
        print("是素数")
    else:
        if number % 2 == 0:
            print("\t此数可以被2整除,因此不是素数。")
        else:
            if number % 3 == 0:
                print("\t此数可以被3整除,因此不是素数。")
            else:
                if number % 5 == 0:
                    print("\t此数可以被5整除,因此不是素数。")
                else:
                    if number % 7 == 0:
                        print("\t此数可以被7整除,因此不是素数。")
                    else:
                        if number % 11 == 0:
                            print("\t此数可以被11整除,因此不是素数。")
                        else:
                            if number % 13 == 0:
                                print("\t此数可以被13整除,因此不是素数。")
                            else:
                                if number % 17 == 0:
                                    print("\t此数可以被17整除,因此不是素数。")
                                else:
                                    if number % 19 == 0:
                                        print("\t此数可以被19整除,因此不是素数。")
                                    else:
                                        print("是素数")

总共 46 行代码,可以在极短时间内,判断一个数是否为素数,但是这个算法,是不准确的!

如图,我们输入 5773 这个数字,它至少可以被 23、251、5773、1 这四个数整除,但是算法显示,是素数,因此这个算法是不准确的。

但是这个算法有个好处就是,可以很快的得出结论,是不需要消耗多少 CPU 算力的。

高阶算法

我们知道有一种绝对是素数的计算方法。

在判断一个数 n 是否是素数时,我们可以用从 1 到 n 的所有数,挨个去除 n 得到是否整除,如果整除的次数大于 2 就意味着除了 1 和 n 本身外,存在其它数可以整除它,就违背了素数的概念,意味着这个 n 就不是素数,反之是素数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
print("提示:最终结果的显示时间取决与CPU的算力和你输入的数大小\n建议输入一千万以下的数字,数字太大无法在短时间内得出结果")
x = int(input('输入一个数:'))
z = 0
for i in range(1,x+1):
    if x % i == 0:
        z = z+1
if z > 2:
    print("不是素数")
else:
    print("是素数")

这是一个高阶算法,利用 Python 本身的代码和函数完成的工作,它计算得到的结果是 100% 正确的,但是它有个唯一的缺点,因为使用的是穷举法,如果是十分巨大的数,我们无法在短时间内得到结果,需要消耗 CPU 的巨大算力去运算才行。

算法思维构建

常规算法

图上仅显示了一个简单的思维过程,其实是以此类推的,我们可以继续除 7、11、13、17、23 之类的。

高阶算法

这是一个近乎完美的方法

代码分析

前言

此次代码分析由于大量使用已经讲过的算法,因此仅分析两个内置函数。

使用 int() 进行数字转换

int() 函数在高阶算法中有使用,我们使用 int()input() 嵌套,不必再多写一行代码来转换,其作用和 float() 函数类似,但是它不会使得数字转化为浮点数,而是一个实实在在的数。

1
2
3
4
5
6
a = "2"
b = int(a)
print(b)
c = b+1
print(b)
print(c)

一个简单的实例,就可以看出它与 float() 函数的区别

运行结果是这样

1
2
3
2
2
3

它是不带小数点和小数点后面的数的。

使用 range() 来生成数

很简单的一个函数,可以到 Python range () 函数用法 | 菜鸟教程 具体学习。

我这里只举一个简单的例子

1
2
for a in range(1,10):
    print(a)

输出结果

1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9

尾声

素数算法的研究,是我开始算法研究迈出的第一步,以后会慢慢进步的!

本博客已运行 days , h , m , s
常记溪亭日暮,沉醉不知归路~