https://baike.baidu.com/item/斐波那契数列/99145?fr=aladdin
斐波那契数列是面试必考题之一
也称为兔子繁殖问题,黄金分割数列,应用极广,python的官网的列子就是斐波那契数列,
后一项的值等于前两项的合,前两项必须指定,
第一项是1 ,第二项也是1,特殊项是0
第一项是0,需要记住
100以内也就到89
我们暂时不用通项公式,用最原始的方式来算
一般起名就叫fib,斐波那契数列Fibonacci sequence
求一百以内的斐波那契数列
a=原来的b,b=a+b的c,颠倒过来就出事情了
这种写法就用到结构了
可以加个序号
跟百度百科的定义一致
11就看不到了
把这个换成101就可以了
这个条件是否可以换个地方
一定要有初始值才能迭代
一般问斐波那契数列所有的值,要么让你求第几项的值,有可能是笔试,也有可能是上机题,
记住第一项是0,第二项是1,第三项是1,往后都是迭代
求10万以内的所有素数,
质数表的质数又称素数。指整数在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。
其实问你的是100以内可以不考虑速度问题,但是10万就需要你考虑了,规模大了,算法低效肯定不行
面试题
x=15797给定一个数,不是偶数,不能被3除,不能被5除,也不是偶数
现在把大概的架子写完,然后改成10万以内
range一般都是从2 ,到这个数-1的位置
x和i取模=0,就不是素数,是合数
就break跳出
这样子是可信的
下面就需要循环了,1不算,其实从2 开始,到100以内
拿x挨个去这么试,查看是否一开始有遗漏
下面就需要优化了,2也没必要,就跳过,直接3试试
查看这一块是否有优化,(3,100,2)把偶数去掉了
查看规律其实,100/2等于把100/50也测了一遍了
所以的对称点,100/10
**乘法的中点,100/10,等于平方的开方
**
但是range无法带小数点,就需要使用int
int是做取整,2.5=2,整数部分往往会小一点,所以以防万一额外+1
现在这样可以大大减少迭代的次数
总共有9592个
查看是否还能优化
质数/素数还有定理,如果这个数大于10,质数一定最后的十进制,最后的最低位一定是13 7
基本上1,3,7,9都是质数
质数中的5 ,基本上5最后都能被5整除
如果能被5整除的就是需要过滤掉的,但是需要大于10以后,不应该是break,因为break跳出循环了,就没有循环了,所以应该是continue
试想一下这个%5能否改掉
这个代码效率不低了,因为后面的2代表,任何素数都不能被2整除,直接跳过即可
上面的(3,10000,2)奇数不要了
下面是(1,int(x 0.5)+1,2)除的过程中,连偶数都不要了
记的时候中间可以不记,但是记得两个部分,奇数部分可以不要
外面的去掉偶数,奇数不能被偶数整除,所以在里面的循环也罢偶数部分去掉
求质数(素数prime number)一定会问
这两个死记是 3,否则出事
算大素数,非常耗时,密码学里面。大素数就是经常用到的东西
要计算上面算法的时间,需要学习一个库,datetime,是个模块,模块名
datetime模块名.datetime类名
delta在数学中表示增量
查看帮助
.点好的优先级很高,就需要把前面算的括号起来
timedelta里面有个total_seconds对象
124s过去了
** _下划线表示丢弃的变量,表示这个变量在python中不关心
第一种算法两个偶数都没去掉,无用功有点多**
第二种方法重新计时
count是在记循环多少次
每个方法各算10次10万以内的素数
第2种明显节省时间
只是把偶数去掉了,在整除的时候也是把偶数去掉了,就提高了这么多效率
这其实是个手表时间,实际上cpu还在忙其他事情
经典面试题有可能会被问到
**假定总数是x个
第一次d1 吃了一半 x//2 -1
第二次d2 d1//d2 -1
.。。。。
d9 d9//2 -1 ==1(第9天其实就剩一个了)
d10 1 **
从1开始往前推‘,9行9次
有限次数的循环用for
无限次数循环用while
以后可能需要用递归的来写