马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
【每天进步一点点】系列作为新手向的Python学习笔记,会记录我在平时的解题过程中遇到的问题以及如何解决的,主要是给新人们学习一个解题的思路。
同一个简单的问题可能有好几种思路,而不同的程序和算法之间的运算效率又会有非常大的区别。
同时,还会不定期得分享一些实用而强大的python标准库或者第三方库。
今天先从“欧拉计划”的第1题开始讲起。
题目:
求1000以下,3和5的倍数的所有数字之和。
先讲思路,如果例举1000以下所有数字,再依次去判断是否能被3或者5整除,如果是就累加,这种方法称作穷举法,是暴力解法的基本思路。
对于数据量小的计算,穷举法当然是没有问题,例如本题。Python一行代码就能得出结果:print(sum([i for i in range(1000) if i%3==0 or i%5==0]))
但是我们设想一下,要是数量大的话会怎么样?比如100万以下,那我们就需要比较100万次,这样速度就会变慢了。
那么,我们可以考虑要是我们把所有3的倍数的数字和5的倍数的数字全加起来不就好了?这里我们需要注意,15既是3的倍数,又是5的倍数,所以最终还要减去15的倍数,不然就会重复计算了。
这样做的话,我们就可以不用每次都去判断了,可以大大减小计算量。Python同样一行代码:print(sum(range(0, 1000, 3))+sum(range(0, 1000, 5))-sum(range(0, 1000, 15)))
那还可不可以继续优化?当然是可以的。
还记得,我们学过的等差数列的计算公式吗?(首项+末项)* 项数 / 2,对了,我们只需要完成一个算式就可以知道和了,何必一个一个去加呢?def calc(start, end, step=1):
return (start+end)*((end-start)//step+1)//2
有了这个公式,哪怕要算1000亿,那也是秒算的。
你看懂算法的奥秘了吗?
|