Python 每日一题:锻炼Python语法的运用,思维逻辑的锻炼,算法能力的培养。
题目:
定义一个函数:打印指定区间内的所有的素数。
分析:
素数:一般指质数,质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
解析:判断一个数n是否为素数,用 该数模2 到该数之前的数 (2 ~ n-1)之间是否存在是否有模结果为0的情况,即:除了其本身及1以外是否还存在第3个因数。
程序实现:
1、用该数模【 2~该数-1】之间的数,是否存在模为0的情况
2、判断用户传入的区间值哪些是素数【封装为函数】
以上程序,解决下问题:
(1)起始值比终止值大的情况 【起始值与终止值交换】
(2)起始值与终止值之间小于0 的情况 【小于0的数不处理】
(3)区间存在多个素数的存储问题【是素数存储至列表,区间数遍历完毕,则返回素数列表】
程序优化:
问题:如果输入数值区间较大,则内层循环都会循环执行(2 ~ n-1)【最坏情况】次
措施:通过素数的规则:判断除了1与本身以外是否还存在第3个因数;同时我们发现一个规律:我们最小的因数为:2 3 5 7,后面的数可以通过 最小因数 * 某个数组成,那我们可以除去该数的一半(修改内存循环为:range(2, n//2+1)),则就可以判断该数是否为素数;此种算法可减少循环次数,提高程序的运行效率,测试结果如下:
测试:
(1)程序优化前,计算 0 ~ 50000 的程序执行时间:
import time
def prime(start_num, end_num):
res_list = []
if start_num > end_num:
start_num, end_num = end_num, start_num
for n in range(start_num, end_num):
if n > 1:
for i in range(2, n):
if n % i == 0:
break
else:
res_list.append(n)
return res_list
start_time = time.time()
print(prime(1, 50000))
print('程序运行时间:', time.time()-start_time)
程序运行时间: 25.67731547355652 【每个人的电脑可能运行的时间不一样】
(2)程序优化后,计算 0 ~ 50000 的程序执行时间:
import time
def prime(start_num, end_num):
res_list = []
if start_num > end_num:
start_num, end_num = end_num, start_num
for n in range(start_num, end_num):
if n > 1:
for i in range(2, n//2+1):
if n % i == 0:
break
else:
res_list.append(n)
return res_list
start_time = time.time()
print(prime(1, 50000))
print('程序运行时间:', time.time()-start_time)
程序运行时间: 11.901249647140503
从测试结果看:程序执行效率提升1倍(内层循环次数减少了1半)
【结语】以上整个程序的实现逻辑,还存在很多不全面的地方,欢迎各位大佬指点;如果觉得笔者不易,请给予点赞,给予我记录更多文章的动力!!