發表文章

目前顯示的是 11月, 2019的文章

Zerojudge 基礎題庫d461 班際籃球賽

圖片
解了這麼多數學題,今天來解一些生活應用問題吧。 當然,要解就要解最簡單的~ 當我看到題目的那一刻,我已經想到如何解了 如果有十個班級,你要怎麼分? 反正一場籃球比賽最多兩個班級PK對吧 所以每一階我可以有10/2場比賽,也就是五場比賽 五場比賽,代表會有五個班級會被淘汰掉,所以這階比賽後會剩下10-5,也就是5個班級 然後5/2 = 2...1,5-2 = 3 再來3/2 = 1...1,3-1 = 2 最後2/2 = 1,2-1=1 也就是WINNER! 看到這裡,來寫流程吧: 準備工作: 設n為比賽總次數,初始值是0 設k為剩餘班級數 設kill為每階淘汰人數 輸入k 開始解題: kill = k/2 (無條件捨去) n = n + kill (淘汰人數等於比賽人數) k = k - kill (算剩下人數) ... 直到k = 1為止 輸出: n 轉成程式碼吧: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <iostream> using namespace std; int main () { /*準備工作*/ //設n為比賽總次數 int n = 0 ; //設k為剩餘班級數 int k; //設kill為每階淘汰人數 int kill; //輸入k cin >> k; /*開始解題*/ while (k != 1 ) //直到k = 1為止 { kill = k /2 ; //(無條件捨去) n = n + kill; //(淘汰人數等於比賽人數) k = k - kill; //(算剩下人數) } /*輸出*/ cout << n; } 感覺有點簡單... #0: 10%  AC  (2ms, 316KB) 通過檢測

Zerojudge 基礎題庫a024 最大公因數(GCD)

圖片
前幾次的AC對我來講是極大的鼓勵,這次來解一點數學吧~ 今天要來解最大公因數 先來想想平常最大公因數是怎麼解的 求(12,15) 我們會先找質數來除除看 如2,3,5 看看可不可以把他們兩個給整除 一直測試到兩數最小數時(12) 來想流程吧: //準備 輸入兩數m,n m,n找出最小值設為s //開始 從2開始測試資料,測到s if 2整除m 且2整除n m = m/2 n = n/2 ans = ans * 2 重複再一遍 else 換成三來測試 轉成程式碼: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #include <iostream> using namespace std; int main () { int m,n; int s; int ans = 1 ; //輸入兩數m,n while (cin >> m >> n){ //m,n找出最小值設為s if (m > n) { s = n; } else { s = m; } //從2開始測試資料,測到s for ( int i = 2 ;i <= s; i ++ ) { while ( 1 ) { if (m % i !=0 || n % i != 0 ) { break ; } m = m / i; n = n / i;

Zerojudge 基礎題庫a015 矩陣的翻轉

圖片
上一題數學題好簡單,這次來難一點,矩陣反轉 簡單來說就是把矩陣順時針轉九十度後鏡像 例如: 3 1 2 8 5 4 8 3 5 1 4 2 3 8 1 5 2 4 所以 a[0][0]  a[0][1]  a[0][2] a[1][0]  a[1][1]  a[1][2] 變成 a[1][0]  a[0][0] a[1][1]  a[0][1] a[1][2]  a[0][2] 再變成 a[0][0]  a[1][0] a[0][1]  a[1][1] a[0][2]  a[1][2] 所以如果我設一個正常的陣列 b[0][0]  b[0][1] b[1][0]  b[1][1] b[2][0]  b[2][1] 1 2 3 4 5 6 a[ 0 ][ 0 ] = b[ 0 ][ 0 ] a[ 0 ][ 1 ] = b[ 1 ][ 0 ] a[ 0 ][ 2 ] = b[ 2 ][ 0 ] a[ 1 ][ 0 ] = b[ 0 ][ 1 ] a[ 1 ][ 1 ] = b[ 1 ][ 1 ] a[ 1 ][ 2 ] = b[ 2 ][ 1 ] 剛好兩個數字顛倒(這好像是定義 -w-) 認識了矩陣反轉,來解題目吧~ 準備 1.輸入row,column(列&行) 2.造出輸入儲存的陣列 q[row][column] 3.造出輸出的陣列 ans[column][row] 輸出 4.輸入陣列 5.開始反轉 6.輸出陣列 先把準備工作做好: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <iostream> using namespace std; int main () { //1.輸入row,column(列&行) int row,column; cin >> row >> column; //2.造出輸入儲存的陣列 q[row][column] int q[row][column]; //3.造出輸出的陣列 ans[column][row]

Zerojudge 基礎題庫a009 解碼器

圖片
這題看起來好像很難,但它下面有兩個提示: cin.getchar(char) getline(cin,string) 一個是讀取一個字元,另一個則是一個字串 題目如下:          1JKJ'pz'{ol'{yhklthyr'vm'{ol'Jvu{yvs'Kh{h'Jvywvyh{pvu5 >>>*CDC is the trademark of the Control Data Corporation.          1PIT'pz'h'{yhklthyr'vm'{ol'Pu{lyuh{pvuhs'I|zpulzz'Thjopul'Jvywvyh{pvu5 >>>*IBM is a trademark of the International Business Machine Corporation. 可以發現到*變成1,i變p,等等... 去查一下ASCII,得知: '*' => 42 '1' =>49 'i' =>105 'p' => 112 很明顯的,'*' + 7 = '1', 'i' + 7 = 'p' 找到規律了!但如何把字元變成數字,數字變回字元? ------------------------------------------------------------------------------------- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <iostream> using namespace std; int main () { string question; getline(cin,question); cout << question; } ------------------------------

Zerojudge 基礎題庫a010 因數分解

圖片
我很討厭因式分解,國中的時候找那些超大的質數真是累死人了。 這題我想到的架構如下: 1.輸入整數 (>1,<1000000) 2.找出質因數式子 3.把結果弄成字串 4.輸出答案 至於如何找出質因數式子(我忘記他叫甚麼了)? 我想先找出所有1000000以內的質數 每找到一個,直接測試(把它拿去當除式) 假設我要找20的質因數式子: 2可不可以整除20? Yes -> 20/2 記住我除了一次 2可不可以整除10? Yes -> 10/2 記住我除了兩次 2可不可以整除5? No -> 輸出"2" 我除的次數是不是比一還多? Yes -> 輸出"^"+除的次數 5等於一嗎? No -> 輸出" * " 3可不可以整除5?  No 4 可不可以整除5? No 5可不可以整除5? Yes -> 5/5 記住我除了一次 5可不可以整除1? No ->輸出"5" 我除的次數是不是比一還多? No -> 不輸出 1等於一嗎? Yes -> 停止程式 ... 好,我們轉換一下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 n = 20 n % 2 == 0? Yes n = n /2 counter ++ n % 2 == 0? Yes n = n /2 counter ++ n % 2 == 0? No cout << "2" ; counter > 1? Yes cout << &

Zerojudge 基礎題庫a006 一元二次方程式

圖片
第一眼看到題目,感覺不是太難,腦中浮現了一個架構: 1. 輸入a,b,c 2.檢查答案數量 (b^2 -4ac) -> if 數量=0 輸出 if數量=1 運算答案 輸出 if數量=2 運算答案 輸出 <- //結束 所以就順手寫出這段程式碼 ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- 但發現到當輸入 1 0 0 時 會跑出 Two same roots x=-0 0 前面有負號 這可不行 所以我在輸出區塊加了 當x==-0 ,x=0 ----------------------------------------------------------------------------------- (前面相同)     if(D < 0)     {         cout << "No real root" << endl;     }     else if(D == 0)     {         cout << "Two same roots";         tem = -b /2*a;         if (tem == -0){             tem = 0;         }         cout << " x=" << tem << endl;         //cal answer     }     else if(D > 0)     {         cout << "Two different roots";         tem = (-b + sqrt(b*b -