2014年6月19日 星期四

[UVA]Divide, But Not Quite Conquer!

UVA 10190、CPE 10419 程式解題。

























































解題觀念:


這題主要的計算就是除法,只是條件比較多。

輸入兩個數,比如125、5。用125除以5,除到後面的結果商為1,餘數為0時,就輸出所有商數( 125 25 5 1 );反之則輸出Boring!。

要注意的是,最後的商數一定要為1,餘數為0;如果最後的商數不是1,也是要輸出Boring!

比如40  2。除到後面商數為5,餘數為0。(因為如果再算下去就會出現餘數,所以只能算到5)
最後的商數是5不是1,所以輸出"Boring!"。

此題重點在於,如何判斷兩數相除的結果為1,並輸出計算過程。

也許有人會想到,每除一次,就輸出一次商數。但這樣會有一個問題:如果除到後面發現商數不為1呢?

比如:40  20  10  5...

電腦印到5之後,發現商數不為1,所以印出Boring!

則你輸出的結果就會變成:40  20  10  5  Boring! =>這樣就不符合題目條件啦!

所以這塊就是本題的重點!最花心思的地方囉~



解題步驟:

宣告StringBuffer字串sb,處理字串輸出比較方便。(因為我直接用String有逾時問題)

宣告字串str,讓使用者輸入。

宣告字串陣列s1[ ],將字串str分割後( str.split(" ") ),存入陣列s1。

宣告整數x,y,將陣列裡的字串轉為整數( Integer.paraseInt() ),分別存給x,y。

之後進入while迴圈,宣告整數陣列ansArray[],存放Function-divid()的值。

另寫Function-divid(),引數為整數x,y,用途為計算兩數相除

======================Function的內容========================

用LinkedList宣告一個物件ans,用來存放計算過程。

宣告一個boolean變數flag,判斷計算過程當中的餘數是否為0。

while迴圈,執行條件為「被除數大於1」,計算兩數相除。

只要計算過程當中有一次餘數不為0,則flag = false,並跳出迴圈。

否則就繼續計算,並將商數存入ans。( ans.add() )

跳出迴圈之後,判斷flag是否為true。如果是true,則表示最後商數為1,餘數為0。

在ans後面加入1 ( ans.add(1) ),並宣告整數陣列ansArray[],大小為ans的長度,將ans裡的數全部複製一份給ansArray,return回去。

(* 為甚麼要加1?
        因為在上面while迴圈的執行條件為被除數大於1,所以當被除數為1時,
        就會跳出while迴圈,就不會執行到ans.add(),所以在後面就要補加上去。

如果flag為false,代表最後商數不為1,則retuen int[0]。(陣列長度為0)

==========================================================

從Function回來到主程式後,判斷ansArray的長度時否為0。

如果是,就輸出Boring! (代表flag = false,return回來的陣列長度為0)

如果不是,則進入for迴圈,將ansArray裡的值加進字串sb。( sb.append() )

每加入一個數後,要加入一個空格。( sb.append(" ") ) (為甚麼要空格? 看題目的範例輸出~ )

全部的數都加進去後,最後要換行。( sb.append("\n") )

將字串sb印出,印出完畢之後要記得將sb清空 ( sb.delete() ),讓下一組資料存入。



EX :

125  5

str = 125  5。

s1[0] = 125;s1[1] = 5。

x = Integer.parseInt(125) = 125;y = Integer.parseInt(5) = 5。

ansArray[] = divid(125,5)。

============進入Function divid==============

while(125>1),成立,

if(125%5==0),成立,ans.add(125),x = 125/5 = 25;

while(25>1),成立,

if(25%5==0),成立,ans.add(25),x = 25/5 = 5;

while(5>1),成立,

if(5%5==0),成立,ans.add(5),x = /5 = 1;

while(5>1),不成立,跳出while迴圈。

進入判斷式,if(flag==true),成立。

ans.add(1),(此時ans的內容為 125 25 5 1;ans.size() = 4)

int ansArray[] = new int[4]。進入for迴圈,進ans的數複製一份給ansArray。

ansArray[0] = (int)ans.get(0) = 125;
ansArray[1] = (int)ans.get(1) = 25;
ansArray[2] = (int)ans.get(2) = 5;
ansArray[3] = (int)ans.get(3) = 1;

return ansArray;
==============跳出Function 回主程式================

進入判斷式,if(ansArray.length==0),不符合。(ansArray.length = 4)

進入else,進入for迴圈,將ansArray的內容加入字串sb。

i = 0,if(i>0),不符合,sb.append(125);
i = 1,if(i>0),符合,sb.append(" "),sb.append(25);
i = 2,if(i>0),符合,sb.append(" "),sb.append(5);
i = 3,if(i>0),符合,sb.append(" "),sb.append(1);

跳出for迴圈,sb.append("\n")。

印出sb,125 25 5 1

將sb清空,sb.delete(0,4)。


後記:
覺得這次似乎寫的比較細了點......
用了一些API,如果看不太懂在留言問我,或是google一下囉~
關於一些API教學,以後有時間再來整理一篇,關於解題比較會用到的來做介紹。


By  小K 





1 則留言:

  1. Nordic titanium alloy - Titanium Arts
    All parts of the titanium water bottle material smith titanium are metal. revlon hair dryer brush titanium The most valuable part of the titanium phone case metal citizen titanium dive watch is the tip of the blade. Nordic titanium alloy features a silver $59.99 · ‎In stock

    回覆刪除