Re: [問題] 我這樣很爛嗎?

看板C_and_CPP作者時間11年前 (2012/09/04 11:48), 編輯推噓4(402)
留言6則, 6人參與, 最新討論串9/10 (看更多)
※ 引述《EdisonX (閉上眼的魚)》之銘言: 小弟是剛接觸C三個多月的新手,好奇第一題也寫一下我的想法。 概念跟yauhh大一樣,將程式碼包裝成易懂的解題概念, 一來增加程式碼的可讀性; 再來可增加程式碼的彈性,即意該程式碼可輕易的被應用在需要類似解題概念的問題上。 : 我只是來討論而已。 : ※ 引述《damody (天亮damody)》之銘言: : 這裡我覺得有爭議說,午夜十二點我看過是 12:00 (am) , 也看過 00:00(am)。 : ... 原文刪節,多多包涵! : 我大概會偷懶這麼做吧 : int Dig[10] = {0}; : ++Dig[a] ; : ++Dig[b] ; : ++Dig[c] ; : ++Dig[d] ; : if(Dig[c]==3 || Dig[d]==3) Counter+=1; : // Counter = Counter + (Dig[c]==3 || Dig[d]==3); // 看到炫技的就別理它了。 我剛好也使用了一個數字陣列來記錄各數字出現的頻率, 看到這個非常興奮! 題目: 在12時制鐘面表示法的限制下,計算一天中3個以上相同數字出現的次數。 拆成: 1.「確認」某一分鐘是否在鐘面上有3個以上相同數字出現: 1.1 將某一分鐘化成鐘面表示法。 1.2 判斷某一數字表示法是否有3個以上相同數字出現。 2.迴圈執行重複確認,並統計一天當中的出現次數。 意見: 1.當中 1.1 與 1.2 就可以輕易應用在其它類似問題上。 另外,遇過類似問題的讀者也就可以輕易看懂此作法。 而沒遇過的人也可以清楚看到你要表達的解題邏輯。 原原po該題的程式碼比較沒有貼近「人性」的包裝, 故讓「人」較難理解,也比較不易讓「人」使用吧! 2.在1.2中,我使用數字陣列來紀錄頻率,而非一行一行的判斷式。 原因除了EdisonX大說得偷懶外XD 還增加了其擴充的方便性— 我可以輕易的改變判斷條件,如3個改成2個或4個; 或是改變輸入的表示法,如加入秒,發票號碼都可以判斷。 當然會喪失一些效能,端看各位取捨。 我想,解決問題還是可以先從抽象的大項目開始分解, 對我這種比較簡單的頭腦來說,比較好出發也比較容易被理解。 最後再與效能作權衡。 附上c程式碼: 1.我偷懶把1.1,1.2寫在同一個函式,沒有照我上面說的分開。orz 2.我額外加了一個把時間列出的函式,檢查程式有沒有搞笑。請忽略。XD 3.我沒有處理00:00am的細節,但相信這並不用增加多少程式碼。(最快的只要兩個字~) #include<stdio.h> #define HOURMINUTE 60 #define HALFDAYHOUR 12 #define WIDTH 2 // hour and minute represented 2 digits #define DEFAULTTALLY {0} // record the frequency of digits enum{NO, YES}; int checkIdenticalDigit(int minutes, int identical); void showTime(int minutes); // find out how many times are there in one day when // there are at least 3 identical digits on the clock int main() { int minutes, count = 0; for (minutes = 0; minutes < HALFDAYHOUR * HOURMINUTE; minutes++) { if (checkIdenticalDigit(minutes, 3)) { showTime(minutes); count++; } } printf("\nThere are %d times in a day when there are at least 3 identical digits on the clock.\n", count * 2); } // checkIdenticalDigit return YES if input implies there are at least // 3 identical digits on the clock int checkIdenticalDigit(int minutes, int identical) { int identicalDigit = NO; int hours; int tally[10] = DEFAULTTALLY; int i, j; hours = 0; while (minutes >= HOURMINUTE) { // convert minutes to HH:MM minutes -= 60; hours++; } for (j = 1; j <= WIDTH; j++) { // analyse the frequency of each digit int i; i = minutes % 10; tally[i]++; minutes /= 10; } for (j = 1; j <= WIDTH; j++) { int i; i = hours % 10; tally[i]++; hours /= 10; } for (i = 0; i <= 9; i++) { // check whether there are at least 3 identical digits if (tally[i] >= identical) identicalDigit = YES; } return identicalDigit; } // primitive implementation of translating minites into HH:MM form // and print them on the screen void showTime(int minutes) { int hours; hours = 0; while (minutes >= HOURMINUTE) { minutes -= 60; hours++; } printf("%2d:%2d\t", hours, minutes); } 閒聊: 小弟其實是人文社會科系出生, 但因為興趣,故目前正在探索學習如何寫程式。 (本文算是從人文的角度切入啦XD) 看到板上高手如雲,po文自介一下。 希望以後先進也能不吝解答小弟的問題。謝謝!<(_._)> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.185.207

09/04 12:46, , 1F
推想法 這才是寫程式的重點
09/04 12:46, 1F

09/04 14:31, , 2F
推想法 +1
09/04 14:31, 2F

09/04 15:11, , 3F
感謝分享想法ˊˋ
09/04 15:11, 3F

09/04 17:17, , 4F
推想法!
09/04 17:17, 4F

09/06 00:42, , 5F
算 hour 怎麼不用 minutes/60 就好呢?
09/06 00:42, 5F

09/06 18:29, , 6F
真的 我傻了orz謝謝樓上! 後來想想還可以簡化很多地方^^
09/06 18:29, 6F
文章代碼(AID): #1GHNeRt1 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1GHNeRt1 (C_and_CPP)