斐波拉契數(shù)列,求第一百個數(shù)字
首先來做一下上節(jié)課的課后作業(yè):
輸出斐波拉契數(shù)列,打印100個數(shù)字 .
提示:斐波拉契數(shù)列就是 1,1,2,3,5,8,13,21,34,55,89......? 這個數(shù)列從第3項開始,每一項都等于前兩項之和
思路如下:
首先需要一個計數(shù)器變量n,用來計數(shù),while循環(huán)當(dāng)計數(shù)器大于100就退出循環(huán)
其次需要2個變量a和b用來存儲相鄰的2個數(shù),比如1和2,或者2和3,或者3和5
然后需要一個變量x來計算a+b的結(jié)果
最后關(guān)鍵的一點,需要利用變量賦值來將計算公式向后移動一個數(shù)字,a=b,b=x,然后再次循環(huán)
核心代碼如下:
a=1
b=1
n=3
while c<=100:
? ? x=a+b
? ? a=b
? ? b=x
? ? n=n+1
為何n要從3開始呢,因為前面1和1已經(jīng)是第一個和第二個數(shù)字了,所以后面從3開始計數(shù)
大家人腦模擬一下電腦,跟著程序邏輯一行一行往下走,記住每一個變量當(dāng)前的值是多少,也可以用紙筆記錄下來
全部程序如圖:
執(zhí)行結(jié)果如圖:
順便說一句,斐波拉契數(shù)列的別稱是黃金分割數(shù)列,也就是隨著數(shù)列項數(shù)的增加,前一項與后一項之比越來越逼近黃金分割的數(shù)值0.6180339887..…
所以說,數(shù)學(xué)到極致就是美,編程同樣如此......
已知2017/1/1是星期天,輸出2017年每一天是星期幾
接下來,再做一個程序,練習(xí)使用循環(huán)和判斷,輸出2017年的每一天分別是星期幾,輸出就用1-7分別表示星期一到星期天
到這里,請同學(xué)們停下來思考,如何設(shè)計程序邏輯,解決這個問題:
思考好了嗎?再想想,只有不停思考,練習(xí),總結(jié)才會有提高
思路如下:
首先,要對2017年的每一天進(jìn)行循環(huán)
然后,循環(huán)當(dāng)中,要知道當(dāng)前是這一年里面的第幾天
再然后,關(guān)鍵點,根據(jù)第幾天,對7求余數(shù),求余數(shù)的話python用%來計算,余數(shù)的值是從0到n-1,例如:1%7=1,2%7=2,...6%7=6,7%7=0,8%7=1,9%7=2......
最后,因為2017年1月1日并不是正好星期一,所以需要增加一個偏移量來校正星期幾
最最后,輸出星期幾的時候需要加1,因為輸出是要1-7,但是求余的結(jié)果卻是0-6
程序設(shè)計:
前面做過一個程序,輸出了一年當(dāng)中每一天分別是什么星座,可以利用這個程序的循環(huán),將判斷星座的程序修改為判斷星期的程序
打開上節(jié)課編寫的程序xingzuoall.py,另存為getweek2017.py,然后刪除掉注釋部分代碼,刪除掉星座判斷部分代碼,剩下代碼如下:
然后,在循環(huán)外面增加一個計數(shù)器,用來存儲是1年中的第幾天:
再然后,增加一個變量week計算是星期幾,并修改輸出內(nèi)容
week= ( n + 5 ) % 7 + 1
print "2017",month,day,week
這里的計算是如何做的呢
我們知道%7的結(jié)果范圍是0-6,然后后面+1,結(jié)果范圍就肯定是1-7,關(guān)鍵當(dāng)中的 + 5 這個偏移量是怎么得來的
是通過2017-1-1是星期天等于7,并且是第1天,然后倒推算出來偏移量的,推算邏輯如下,這個學(xué)過方程式的應(yīng)該能夠理解:
week = ( n + x ) % 7 + 1
week = 7
n = 1
7 = ( 1 + x ) % 7 + 1
6 = ( 1 + x ) % 7
6 = 1 + x
5 = x
完整的代碼如下:
計算結(jié)果如下:
關(guān)鍵是檢查第1天和最后1天看看是否正確。
輸出2016年每一天是星期幾
如果要計算2016年的每一天是星期幾,關(guān)鍵的一點是2016-1-1是星期幾,計算出偏移量
大家根據(jù)前面計算偏移量的公式自己計算一下,先不要看下面的答案,看看算的對嗎:
week = ( n + x ) % 7 + 1
week = 5
n = 1
5 = ( 1 + x ) % 7 + 1
4 = ( 1 + x ) % 7
4 = 1 + x
3 = x
修改一下程序,另存為getweek2016.py,先不要看下面的程序,自己看看結(jié)果對嗎
修改代碼如下:
大家仔細(xì)檢查,是否發(fā)現(xiàn)好像最后一天不對吧,那么再往前仔細(xì)檢查一下看看從哪一天不對了,大家想想為何不對呢
最后發(fā)現(xiàn),2016年是閏年,2月份是29天,那么,同學(xué)們知道應(yīng)該修改哪里嗎?
應(yīng)該修改max=28這一行為max=29
保存代碼,再次運行,這次結(jié)果就正確了
輸入一個年份,判斷輸出閏年或者平年
還記得0009課的課后作業(yè)嗎:
課后作業(yè):
輸入一個年份,判斷輸出閏年或者平年
提示1:閏年的規(guī)則,能被4整除的年份是閏年,但要排除那些能被100整除并且不能被400整除的年份
提示2:判斷是否能整除,利用求余運算符%,如果能被4整除,就是 x%4==0
例如:2016是閏年,2000年是閏年,2100年是平年
結(jié)果應(yīng)該如下才是正確的:
大家如果自己寫的代碼結(jié)果不對,那么再次思考,重新修改,不要急著看答案
程序如下:
大家再次思考一下,可以用一行判斷代碼實現(xiàn)嗎?
提示一下,可以用到not這個邏輯運算符,注意not和and如果并列在一起的話,是哪個優(yōu)先級更高,提高優(yōu)先級可以用()將需要優(yōu)先運算的條件表達(dá)式括起來
程序如下:
?
課后作業(yè)
輸入一個年月日日期,輸出是星期幾
程序邏輯提示:
先確認(rèn)一個錨點,也就是1900-1-1為星期一=0,然后計算輸入的年月日日期和1900-1-1相差多少天,根據(jù)相差天數(shù)對7求余,然后根據(jù)偏移量即可算出
關(guān)鍵點在于計算相差多少天,因為輸入的日期和1900年是跨多年的,需要用循環(huán)累計計算當(dāng)中每一年的總天數(shù),這個時候就需要判斷當(dāng)中每一年是否是閏年還是平年
程序需要的要素前面都已經(jīng)講過了,這個課后作業(yè)就是要將全部要素集成起來,還是有點難度哦,大家加油!
往期教程
0001 零基礎(chǔ)的小白能學(xué)會編程嗎?
0002 真的嗎,700元的電腦可以學(xué)會編程?
0003 十分鐘組裝一臺電腦開始編程
0004 如何編寫人生的第一行代碼helloworld
0005 鍵盤打字如何練成像黑客一樣的飛速
0006 編程入門python語言之加法計算器
0007 編程入門python語言之四則運算器
第一部分前7課小結(jié)和課程規(guī)劃說明及微信群主招募
0008 加減乘除也會算錯?還要編寫程序測試?
0009 如何編寫程序計算所屬星座,一看就懂
0010 人生就像死循環(huán),只要不退出就要繼續(xù)運行
因為教程是系列教程,前后關(guān)聯(lián)性非常強,請大家按照微信公眾號的發(fā)布時間先后次序進(jìn)行閱讀。
微信公眾號里面直接輸入序號可以查看該序號課程,例如輸入0001可以查看【0001 零基礎(chǔ)的小白能學(xué)會編程嗎?】
作者簡介
學(xué)哥,二十年編程經(jīng)驗,歷任程序員,資深程序員,技術(shù)經(jīng)理,項目經(jīng)理,產(chǎn)品經(jīng)理,系統(tǒng)架構(gòu)師,IT總監(jiān)。愛好篆刻,閱讀,美食。
微信號簡介
每天半小時零基礎(chǔ)學(xué)編程。大人可以學(xué),小孩也可以學(xué)。練打字,用軟件,寫文檔,做網(wǎng)站,做App,編游戲,數(shù)據(jù)庫,玩硬件,寫程序,3D打印,無人機,機器人。
html,css,javascript,python,php,java,swift,mysql,android,ios,raspberry pi,scratch. 微信公眾號搜索:零基礎(chǔ)學(xué)編程。
QQ群簡介
歡迎大家加入QQ群 603559164 零基礎(chǔ)學(xué)編程,交流學(xué)習(xí),共同進(jìn)步。