0011 迷人的斐波拉契數(shù)列,數(shù)學(xué)到極致就是美,編程同樣如此

斐波拉契數(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)步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容