博主在前乙個月參加了bit計算機學院的夏令營活動,考試環節有機試和面試,其中機試有兩道題。當時我正在做乙個unity3d的賽車專案,每天愉快地寫著c#,調著各種庫,近兩年來對於c語言的接觸又僅限於做圖形學和opengl作業,很多基礎慢慢生疏了,於是機試上來第一題就看蒙了。
回來以後由於考研保研考試的緣故,從頭學習c語言,使用的是brain w.kernighan和dennis m.ritchie所著的《the c programming language》原書,不得不說這本書比起譚版的教材更貼近語言本身,所選取的程式很完整,習題也很不錯,重要的是把整個c語言的學習分成了基礎、操作符和表示式、控制流、函式、輸入輸出流這樣的模組,我個人更喜歡這樣的分類法,因為它貼近於程式設計的實踐過程。
閒言少敘,下面就上題目(回憶版)。
程式設計實現:用英文單詞zero、one、two…分別表示0~99內其所對應的數字(如six表示6,one two表示12),實現兩位數的乘法,輸出乘積。
輸入:two one * three * four
輸出:252
讀者在往下看之前不妨先思考一下能否構思出比較完整的框架:比如不限於兩位數,能適應於多位數,可以從乘法輕鬆擴充套件到四則運算等等。這個題目重點考察的是輸入以及控制流方面的能力,在回顧完控制流這一章後,再來看這個題目就非常的清楚。
首先,對於輸入,我們假設輸入無誤,那麼輸入的都是空格、數值單詞和乘號,並且總是數值單詞位於輸入的最末端。從輸入型別來看,我們首先要判別的是三類的輸入:空格、單詞、乘號。這三者中空格是無效資訊,因為它既可能處於數值之間(對於兩位數的情況)也有可能處於數值和乘號之間,因此我們可以在一開始就把它當做無效資訊通過判斷語句消除。
其次,對於單詞和乘號,很明顯乘號是乙個標誌,它隔斷了前後的兩個數字,而我一開始考慮到的方法有1、每出現一次乘號就做一次乘法2、使用棧來把前後兩個數字分別壓進去,當出現下乙個乘號或者輸入結束的時候對棧內的兩個數字彈出並做乘積。
首先建立兩個棧:乙個數字棧,乙個符號棧。數字棧中的元素型別是字元陣列,符號棧中的元素型別是字元。用乙個足夠長的字元陣列input承載輸入,每當出現一次乘號以後,首先檢查符號棧中是否有乘號,若無則乘號入符號棧,input中的內容進數字棧;若有,則彈出數字棧中數字,與當前input中的數字做乘法,之後把符號棧中的乘號彈出。這樣的過程需要首先建棧,之後為棧寫初始化、獲取頂部元素、入棧、出棧等方法,這些內容在資料結構中都有涉及,這裡就不多說了,這裡還會有乙個關於把單詞數位化的過程,我會在下文進行討論。
我們回到第一種方法:每出現一次乘號就做一次乘法。這種方法從整體構思上來說並不難,但要考慮到如何使得整個過程完整地迴圈起來,首先遇到乙個稱號就做一次乘法,那麼對於第乙個出現的數值來說我們可以把它算作是總量的初始值,那麼之後的每乙個數字只需要對它進行累乘,這是很直觀的,但壞處在於我們需要在輸入的迴圈中新增賦初始值的判斷語句;我們也可以把初始值的初值設為1,這樣的話就可以把包括第一項的所有輸入等同起來,正如我**所寫的:
char c;
//number陣列接收輸入的單詞
char numbers[longnum];
//mul為累乘結果
int mul = 1,pos=0;
while((c=getchar())!=eof)
else if(c >= 'a' && c <= 'z' && pos < longnum)
}
整個方法的主要流程已經在這段**中體現出來,在while控制的輸入迴圈中:我們忽略空格;number陣列接收輸入的數字,每當有字母輸入時使字母覆蓋pos所對應的陣列位置;當出現標誌*和回車時結束當前輸入(陣列結尾加上結束符),用checknum函式返回陣列中所對應的數字並累乘,把pos歸零。
整個過程應該是比較清晰的,最後我們來討論一下轉換單詞的checknum函式。對於陣列number中的字串來說,有可能是一位數也可能是兩位數,而0~9的所有單詞中最長的是5個字元,因此我們考慮把陣列初始長度longnum設為12(或以上)。
之後是識別字元的問題,在本文中我使用的是switch語句,我們可以觀察one;two、three;four、five;six、seven;eight;nine;zero被分號隔開的都是單個單詞或者首字母相同的兩個單詞,這是處理物件的固有特質,因此用switch語句先把它們分組相信能使得**更簡短一些。
int checknum(char num)
{ //snumber為將要返回的字串值
int snumber = 0,i = 0;
for(int j = 0;i
結合注釋是很容易理解的,處理數字的方法是把現有值snumber*10加上當前輸入值。這個函式不僅適用於兩位數,也可以適用於更多位數。
下面貼三組執行資料,其中第三組有輸入錯誤
歡迎各位的交流和指教
原始碼:
兩位數乘法
option base 1 private sub command1 click dim m as string dim n as string m trim text1.text n trim text2.text dim number1 as byte dim number2 as byte r...
兩位數的乘法
private sub command1 click dim n as integer dim m as integer n trim text1.text m trim text2.text dim number1 as integer dim number2 as integer redim n...
兩位數乘法的速算方法(一)
兩位數乘法的速算方法 一 講的是兩位自然數的相乘,即如何計算abxcd的相乘結果,例如86x32。ab叫被乘數 cd叫乘數 設兩位數分別是10a b,10c d,其乘積為s,根據多項式展開 s 10a b x 10c d 10a x 10c b x 10c 10a x d bxd。所謂速算,就是根據...