今天開始著手學(xué)習(xí)C語言常用算法.
常規(guī)單片機寄存器的配置,基本已經(jīng)掌握,現(xiàn)在感覺自己的技術(shù)停滯了,主要卡在單片機編程中常見的算法類程序,不知道從何下手,這一帖重點學(xué)習(xí)C語言算法類的編程.
今天開始著手學(xué)習(xí)C語言常用算法.
常規(guī)單片機寄存器的配置,基本已經(jīng)掌握,現(xiàn)在感覺自己的技術(shù)停滯了,主要卡在單片機編程中常見的算法類程序,不知道從何下手,這一帖重點學(xué)習(xí)C語言算法類的編程.
本人斷斷續(xù)續(xù)學(xué)習(xí)C語言也有3,4年了,市面上常見的經(jīng)典的C語言書籍,幾乎都有,雖然常用的語法很了解,但總感覺沒有真正理解C語言.
本人一直從事硬件開發(fā),工作中基本上都是和二極管,三極管,變壓器,運放,電容這些常見的元器件打交道,幾乎用不到單片機這一塊,可是單片機一直沒有真正的突破,心里上總感覺有一道坎沒有跨過去.今年年初,我決心克服自己的惰性以及畏懼,拿下單片機這一塊,打通心里上的這道坎.
每天處理好手頭上大量的工作后,我便埋頭苦學(xué),雖然很累,但感覺很充實.
想起鐘道隆將軍的那句名言:何以解憂,唯有學(xué)習(xí).
每天精進是我的追求,和志同道合者共勉.
接著編寫了一個階乘的代碼.
剛開始準(zhǔn)備搞定100以內(nèi)的數(shù)據(jù)的階乘,怎知計算至12的階乘,數(shù)據(jù)便開始溢出.
這應(yīng)該算是第一個小小的計算類的編程吧.
思路其實很簡單;
2!=2,3!=2!*3,4!=3!*4,5!=4!*5,以此類推.公式為n!=(n-1)!*n,n>=2;
編程的思路是什么,很簡單,命名一個數(shù)據(jù),該數(shù)據(jù)通過循環(huán)實現(xiàn)累加,再命名一個數(shù)據(jù)用于將前面的數(shù)據(jù)累積.
源代碼
一定要注意,此處我寫的100的階乘,實際上會出現(xiàn)數(shù)據(jù)溢出,而且貌似VC++6.0不支持unsigned long long型數(shù)據(jù).
另外100的階乘應(yīng)該是非常龐大的一個數(shù)值,搞不好會死機,大家可以試一試.
搞定冪函數(shù)計算程序.該程序適用于實數(shù)的整數(shù)次冪計算
思路算法很簡單,當(dāng)需要求解一個實數(shù)的整數(shù)次冪時,只需要將該實數(shù)通過循環(huán)需求的整數(shù)次即可.
算法實現(xiàn):n^p=n循環(huán)自乘P次數(shù)即可.
源代碼
這段時間一直埋頭學(xué)習(xí)C語言基礎(chǔ),慢慢發(fā)現(xiàn)計算機語言的發(fā)明真的很牛B.
大家知道不管什么高級語言其實一般就三種結(jié)構(gòu),循序結(jié)構(gòu),循環(huán)結(jié)構(gòu),選擇結(jié)構(gòu).通過這三種結(jié)構(gòu)的自由組合,就能實現(xiàn)各種功能,不得不服.
每天不斷的敲著代碼,模仿別人的代碼,理解別人的思路,慢慢的,對于編程的思路我也開始有一點了,至少不在像過去那樣迷茫,摸不著頭緒.每天進步一點,不斷堅持,技術(shù)上必將有重大突破.
雖然很累,但一直努力學(xué)習(xí),埋頭苦學(xué),只管耕耘,不問收獲,和志同道合者共勉.
繼續(xù)更新.
第一個算法程序,求余數(shù).
源代碼
算法思路:通過對輸入數(shù)值取余,然后輸出其最后的兩位數(shù)值.該程序主要是為了加深對%符號的理解.
判斷輸入的數(shù)值是否為素數(shù),如果不是素數(shù)則將其所有的約數(shù)均打印出來.
源代碼
算法思路:其實很簡單,只需要知道素數(shù)的概念就知道如何下手,素數(shù)是指除了1和它本身以外,不能被任何整數(shù)整除的數(shù).根據(jù)素數(shù)的概念需要排除1,然后再通過(素數(shù)%2是否等于0)來判斷.
這段代碼我糾結(jié)了大半天,不過還是搞定了.
最后一段代碼是判斷閏年的代碼,根據(jù)輸入的日期求出某月份某一天的總天數(shù).
源代碼
算法思路:第一個是判斷閏年的思路,if(a%4==0&&a%100!=0||a%400==0),這是判斷閏年的思路.接下來是根據(jù)閏年非閏年求取具體某一天的總天數(shù).
三角形類型判斷程序
源代碼
算法思路:首先判斷三條邊兩兩相加是否大于第三邊,這是普通三角形判斷的首要條件,接著判斷三條邊之間的關(guān)系,相等或者平方相等等等.
其實就是等邊三角形,等腰三角形,直角三角形,等腰直角三角形等條件判斷而已.
算法思路:直接插入排序是由兩層嵌套循環(huán)組成。第一層循環(huán)用于確定待比較的數(shù)值。第二層循環(huán)將兩數(shù)值進行比較排序。
直接插入排序是將待比較的數(shù)值與它的前一個數(shù)值進行比較,所以第一層循環(huán)是從第二個數(shù)值開始的,當(dāng)前一數(shù)值比后一數(shù)值大,則循環(huán)比較,直到找到比待比較數(shù)值小的數(shù)值則束該次循環(huán).
個人覺得直接比較排序的速度其實是最慢的一種,后面還有各種經(jīng)典的排序方法介紹,當(dāng)然程序的理解難度也加深,我個人也有很多疑問,希望和大家共同探討.
直接排序在數(shù)據(jù)量比較小的時候可能問題還不大,但是如果有100個數(shù)字,10K數(shù)字,1000K數(shù)字的時候呢,隨著數(shù)據(jù)量的增加,直接排序的速度會成倍的下降,此時不得不考慮優(yōu)化算法.
希爾排序的算法思路:
先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)
接著將若干子序列分別進行直接插入排序,然后依次縮減增量再進行排序
待整個序列中的元素基本有序時,再對全體元素進行一次直接插入排序
因為直接插入排序在元素基本有序的情況下,效率很高
希爾排序在時間效率上比直接排序有較大提高
http://blog.csdn.net/morewindows/article/details/6668714
看到<增廣賢文>中的一段經(jīng)典名句,共享給大家
未曾清貧難成人
不經(jīng)打擊老天真
自古英雄出煉獄
從來富貴入凡塵
醉生夢死誰成器
拓馬長槍定乾坤
揮軍千里山河在
立名揚威傳后人
注:現(xiàn)金紅包僅限當(dāng)日領(lǐng)取
活動介紹:http://www.e-ticket.cn/bbs/1531738.html
算法思路:
第一步比較相鄰的前后兩數(shù)據(jù),如果前面數(shù)據(jù)大于后面的數(shù)據(jù),就將這兩個數(shù)據(jù)交換。
第二步對數(shù)組的第0個數(shù)據(jù)到N-1個數(shù)據(jù)進行一次遍歷后,最大的一個數(shù)據(jù)就“沉”到數(shù)組第N-1個位置,也就是所謂的冒泡的思路.
第三步N=N-1,如果N不為0就重復(fù)前面二步,否則排序完成。