2014年4月9日 星期三

[UVA]Doom's Day Algorithm

UVA 12019、CPE 22801 程式解題。




















解題觀念 :

這題主要就是輸入日期,要你找出那一天是星期幾

日期範圍是2011一整年,所以就先找出2011年1月1號是星期幾,並以那一天作為起始點。

先算出總天數(比如 : 2 28,經過59天),再用取餘數的方式(7天一循環)找出這一天星期幾。

然後,一行輸入為一筆測資,而且是以"空白"分開月分和天數,所以想一想要如何處理空白,然後個別處理呢?


解題步驟 :

宣告字串陣列week,建立星期幾(?)對照表。

宣告整數陣列day,建立月份天數對照表。(0月份設為0天)

宣告字串陣列str,等等要用來處理測資。

宣告整數D,累計經過的總天數;宣告整數ans,最後用來找出星期幾。

整數n,使用者輸入共有n筆測資。

字串space,用來讀取n後面的空白
(因為 .nextLine() 可以連空白一起讀取,所以當我們輸入完數字n按下enter那一瞬間,n後面的那一格空白會被.nextLine()讀取到,造成字串無法輸入,所以必須在輸入字串之前,先用一次.nextLine(),將空白讀取掉。)

簡單來說,就是nextInt()和nextLine()並用會有一些狀況,其解決方法就是要用兩次nextLine(),才能輸入字串。

之後設定for迴圈,中止條件為跑n次為止。

接下來就講到,如何將一行資料,分割成兩筆資料啦!

用空白分割字串(.split(" ")),變成兩筆資料,同時存入str陣列裡面。
(ex : 2 28。str[0] = 2;str[1] = 28。)

之後再設定另一個for迴圈,用來累加前幾個月的天數。
(ex : 2 28。已經過一月分了,所以必須加上一月份的天數,但是要注意 : 不用加2月的天數!因為2月還沒過啊!)

(Integer.parseInt(str[0]) : 因為str[0]為字串,所以必須將它轉為int。 )

累加完月數後,再把多出來的天數(28天),加上去,存放到D。

之後再用取餘數的方式(asn = D%7)找出那一天是星期幾,利用陣列week對照(week[ans])。

最後記得,初始化


EX :

1
2 28

n = 1。(這我不多說了!)

str = "2 28";用.split(" ")分割 => str[0] = 2、str[1] = 28。

進入for迴圈,起始值為0,跑到1月份為止。
( Integer.parseInt(str[0])-1 => 2 - 1 = 1)

D = D + day[1] = 0 + 31 = 31,跳出迴圈。

D = D + Integer.parseInt(str[1]) = 31 + 28 = 59。

ans = 59 % 7 = 3。

week[3] = Monday。

印出 Monday。


By   小K



沒有留言:

張貼留言