Re: [問題] 我這樣很爛嗎?
※ 引述《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
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
09/06 00:42, 5F
→
09/06 18:29, , 6F
09/06 18:29, 6F
討論串 (同標題文章)