前言
对于一个数是否为素数,常规的方法就是 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()
函数的区别
运行结果是这样
它是不带小数点和小数点后面的数的。
使用 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
|
尾声
素数算法的研究,是我开始算法研究迈出的第一步,以后会慢慢进步的!