發表文章

目前顯示的是有「Zerojudge 基礎題庫」標籤的文章

Zerojudge 基礎題庫a038 數字翻轉(Python)

前言: 這題非常簡單,相信再仔細想想一定可以解出來 那我就來敘述我是如何解出這道題目的。 首先,我們要先設一個變數來存放題目,叫做q。 所以輸入一個數字存入p變數的程式碼是: q = input () 下一步呢,要 設計幾個例子 ,越少越好,可以應付所有的情況。 我有想到三個: q = 12345 q = 50500 q = 00000 通常在寫的時候,我喜歡把 q = input() 先用 q = (數字) 替代,這樣就不用一直打數字,按一下執行就跑出結果了。 但是要注意的是,使用input時, 回傳的東西是字串 ,所以測試時,要寫: q = '數字' 第一部分:當q = '12345'時 字串不容易編輯,所以先把它變成串列 q = '12345' q = list (q) 這樣我們的 '12345' 就會變成 ['1', '2', '3', '4', '5'] 接下來呢,你有非常多種作法,但python有的函數叫 reverse() ,用一下心裡舒暢~ q = '12345' q = list (q) q . reverse() 現在 ['1', '2', '3', '4', '5'] 變成 ['5', '4', '3', '2', '1'] 再使用for迴圈一一輸出,結束! q = '12345' q = list (q) q . reverse() for i in q: print (i,end = '' ) print () 第二部分:當q = '50500'時 我們使用上面的程式,最後會輸出 00505 但題目有要求,前面有0以下應消除 所以結果應該是505 我們可以檢測q的第一項是否為0, 如果為零,把第一項刪掉 。 q =...

Zerojudge 基礎題庫a040 阿姆斯壯數(Python)

圖片
題目要求輸入兩個數字,代表著範圍,並輸出範圍裡的阿姆斯壯數們。如沒有,輸出none。 從上面往下看,只要一有想法,可以直接拋棄這篇文章,追隨你的想法。 1. 什麼是阿姆斯壯數 從題目節錄 所謂 Armstrong number 指的是 一個 n 位數的整數,它的所有位數的 n 次方和恰好等於自己 。 相信你沒有問題 :) 2. 如何開始? 如果是我,我會先 做一個函數,判斷是否為阿姆斯壯數 的函數 3. 如何知道範圍內是否有阿姆斯壯數? 使用for迴圈,直接 窮舉 ,再一一判斷是否為阿姆斯壯數。 4.我要程式碼!! 自己寫才會進步,每人寫出的程式碼都有自己的特色,要好發掘自己的特色。 def spreadNum (num): '''enter a string (integer) and returns the split ('3000' -> ['3', '0', '0', '0']) (list)''' list1 = list (num) return list1 def calSpread (list1): '''input: a list which is splitted (['3', '0', '0']) (list) output: the calculation of the num (integer)''' ans = 0 for i in list1: ans = ans + int (i) ** len (list1) return ans while 1 : try : q = input () except : break q = q . split() button = int (q[ 0 ]) top = i...

Zerojudge 基礎題庫a021 大數運算(Python)

圖片
eval()真是太好用了~ 只是要排除除法的問題有點煩,Python好棒! 程式碼: 1 2 3 4 5 6 7 8 9 10 11 12 while 1 : try : x = input () except : break y = x . split() if y[ 1 ] == "/" : print ( int (y[ 0 ]) // int (y[ 2 ])) else : print ( eval (x))

Zerojudge 基礎題庫a020 身分證檢驗(Python)

圖片
基本上不要把fake打成false就可以了,耐住性子。 程式碼: 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 def tran_to_number (char): num = ord (char) # A ~ H, 65 ~ 72 -> -55 if num >= 65 and num <= 72 : num = num - 55 # I ,73 -> 34 elif num == 73 : num = 34 # J ~ N, 74 ~ 78 -> -56 elif num >= 74 and num <= 78 : num = num - 56 # O, 79 -> 35 elif num == 79 : num = 35 # P ~ V, 80 ~ 86 -> -57 elif num >= 80 and num <= 86 : num = num - 57 # W -> 32 elif num == 87 : num = 32 # X -> 30 elif num == 88 : num = 30 # Y -> 31 elif num == 89 : num = 31 # Z -> 33 elif num == 90 : num = 33 return num % 10 * 9 + num // 10 while 1 : try : ...

Zerojudge 基礎題庫a017 五則運算(Python)

圖片
只要有碰到字串的題目,都麻煩死了... 這題我做了5個小時,感覺自己在搞混自己,幸好,最後debug出來了 這題有兩個思維我想說,一個是括號,另一個是先乘除後加減。 1.括號 括號是一個棘手的題目,因為一題可能有兩個以上括號,還有可能括中括 那怎麼辦? 舉一個例子好了: (( 1 + 2 ) + ( 3 + 4 )) + 5 先找最右邊的  '('   : (( 1 + 2 ) + ( 3 + 4 )) + 5 然後找她右邊的第一個  ')'  : (( 1 + 2 ) +  (  3 + 4 ) ) + 5 再來我們把()中間的東西運算好,整個替代 ( 3 + 4 ) (( 1 + 2 ) + 7 ) + 5 然後一直重複以下步驟,一直到沒有括號 (( 1 + 2 ) + ( 3 + 4 ) ) + 5 ( ( 1 + 2 ) + 7 ) + 5 ( 3 + 7 ) + 5 10 + 5 最後再計算一次就行了~ 2.先乘除後加減 首先,我們只合併 * / % 這些符號 最後,再合併 + - 這些符號 例如:  2 * 3 + 10 / 5 - 3 % 2 我們先看 * / %  2 * 3 + 10 / 5 - 3 % 2 6 + 10 / 5 - 3 % 2 6 + 2 - 3 % 2 6 + 2 - 1 再看 + - 6 + 2 - 1 8 - 1 7 提示就這些,剩下的自己練習吧 3.程式碼: 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 6...

Zerojudge 基礎題庫a013 羅馬數字 (Python)

圖片
一、題目重述 這題真的需要好好講一下,因為題目敘述真的好長。 我重新敘述一下題目好了: 輸入: 兩個羅馬數字 輸出: 一個羅馬數字,值為輸入的兩值相減 二、解法大綱 首先,羅馬數字只是用來單純標示他的值,無法做計算 而且電腦只看得懂阿拉伯數字,所以在做計算時,須先把羅馬轉成阿拉伯 因為題目是輸入兩個羅馬數字,無法直接做相減的動作,所以第一步先把羅馬轉成阿拉伯。 轉成阿拉伯後,就可以相減了,記得加絕對值,因為題目說可能第一數比較小。 計算出答案後,最後把它變成羅馬數字,就可以了。 三、解法問題 有兩個問題,也就是題目的主要部分。 1.羅馬轉成阿拉伯 我們先來觀察一個羅馬數字: III 我想聰明的你,這一定是三,那我問: 你怎麼知道? 我先給一下轉換表: I 1  V5  X10  L50  C100  D500  M1000 好,回來正題,III可以看成是 I + I + I 轉換後也就是 1 + 1 + 1,答案是3 再一個羅馬數字 IV 如果你用上面的方法,1 + 5 = 6,可是答案是四耶~ 那是因為羅馬數字有一個特殊的規則, 數碼限制: 同一數碼最多只能連續出現三次,如40不可表示為XXXX,而要表示為XL (羅馬數字 - 維基百科) 如果我們使用IIII來表示4,感覺I太多了,所以用IV來表示,意思是 5 - 1 換一個方式來表達,也就是 -1 + 4 那  MCDXXXVII  呢?我們先把一個一個分開來,變成: M, C, D, X, X, X, V, I, I 接下來,一一轉成數字,變成: 1000, 100, 500, 10, 10, 10, 5, 1, 1 接著,我們使用一個小伎倆: 在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字減小數字 我們先找右邊數字比自己大的,找到就把它變成負的 1000, 100, 500, 10, 10, 5, 1, 1 1000右邊是100,比1000小,不變成負的,下一個 100右邊是500,比100大,把它變成負的(100 => -100) 500右邊是10,...

Zerojudge 基礎題庫a004 文文的求婚 (Python)

圖片
西元年被4整除且不被100整除,或被400整除者即為閏年 => year % 4 == 0 and year % 100 != 0 or year % 400 == 0 如果是True就是閏年 False 則是平年 對!就這樣~ Python 程式碼: 1 2 3 4 5 6 7 8 9 10 while 1 : try : x = int ( input ()) except : break if x % 4 == 0 and x % 100 != 0 or x % 400 == 0 : print ( "閏年" ) else : print ( "平年" )

Zerojudge 基礎題庫a002 簡易加法

圖片
這題簡單,不多做說明。 記得重複測資,詳細請參考基礎題庫a001的範例程式碼。 程式碼: 1 2 3 4 5 6 7 8 9 10 11 12 #include <iostream> using namespace std; int main () { //input two number; int inputA,inputB; while (cin >> inputA >> inputB) { cout << inputA + inputB << endl; } }

Zerojudge 基礎題庫a148 You Cannot Pass?!

高中時期,不是所有科目都已80,90分為目標了,能過60,不用補考就是世界上最幸福的事了~ 這題就是,把成績相加除以成績數,是否大於59?有,恭喜,你過了!! 值得注意的是, 大於n包含n 歐,所以59分,過! 還有, 小心有浮點數 。 所以用int,不會過喔。 c++ 程式碼: 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 #include <iostream> using namespace std; int main (){ int a; double input; double ans; while (cin >> a){ ans = 0 ; for ( int i = 0 ; i < a; i ++ ){ cin >> input; ans = ans + input; } if (ans / a <= 59 ){ cout << "yes" << endl; } else { cout << "no" << endl; } //cout << ans / a << endl; } }

Zerojudge 基礎題庫a059 完全平方和

圖片
這題算是還好,設一個平方函數可以增加程式可讀性。 只記得他不是使用while來重複測資,他使用for迴圈 而且格式有使用到for("Case 1~...") 程式碼: 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 #include <iostream> using namespace std; int make_double ( int num){ return num * num; } int main (){ //the quantity of testing int needTest = 0 ; cin >> needTest; //a~b int a,b; for ( int j = 1 ; j <= needTest; j ++ ){ cin >> a >> b; int ans = 0 ; for ( int i = 0 ; i <= 40 ; i ++ ) { if (make_double(i) >= a && make_double(i) <= b) { ans += make_double(i); //cout << "add" << make_double(i) << endl; } } cout << "Case " << j << ": " << ans << endl; } }

Zerojudge 基礎題庫a147 Print it all

圖片
這題也是一道簡單的題目 "若 n = 0 表示資料結束" 這句話可以忽略。 C++ 程式碼: 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 #include <iostream> using namespace std; /* 大於 0、整數、不可以被 7 整除、小於 n n = 1時 1 % 7 != 0? Yes */ bool check_if_okay ( int inputA) { if (inputA % 7 != 0 ) { return true ; } else { return false ; } } int main () { int n; while (cin >> n) { for ( int i = 0 ; i < n; i ++ ) { if (check_if_okay(i) == true ) { cout << i << " " ; } } cout << endl; } }

Zerojudge 基礎題庫a215 明明愛數數

圖片
這題算簡單的,但有一個地方需要注意的: ---------------------------------------------------------------------- 如果從1開始數,數到第幾次時超過0? 答案是1,不是0,因為他是 數後才檢查 是否有超過。 ---------------------------------------------------------------------- 你會覺得,恩,對啊,然後勒? 但你要知道, for迴圈是先檢查再執行程式區塊裡的內容 的。 所以加一個if敘述再用for迴圈吧。 喔,還有,他沒有出一些很爛的題目(像是浮點數阿,blablabla。。。) 所以int,double之類的都可以使用。 超棒(短)程式碼: 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; /* 1~... max5 1 = 1 1+2 = 3 1+2+3 = 6 */ int getAnswer ( int n, int m){ if (n > m){ return 1 ; } int current = 0 ; int counter = 0 ; for ( int i = n;current <= m;i ++ ){ current += i; counter ++ ; } return counter; } int main (){ int n; int m; while (cin >> n >> m){ cout << getAnswer(n,m) << endl; } }

Zerojudge 基礎題庫a034 二進位制轉換

圖片
十進位轉二進位,現實生活中如何做到? 相信聰明的你,一定想到...... ------------------------------------------------------------------- 假設題目是23: 先找二進位最大的位數 23 >= 1?   Yes 23 >= 2?   Yes 23 >= 4?   Yes 23 >= 8?   Yes 23 >= 16? Yes 23 >= 32? No 所以 最大位數是第5位 。 2^5 = 16, 從十六開始減 23 >= 16? Yes  -> 23-16=7,螢幕上 "1" 7 >= 8?     No   ->                   螢幕上"10" 7 >= 4?     Yes  -> 7-4=3    ,螢幕上"101" 3 >= 2?     Yes  -> 3-2=1    ,螢幕上"1011" 1 >= 1?     Yes  -> 1-1=0    ,螢幕上"10111" 答案:10111 ------------------------------------------------------------------- 看了這個例子,相信應該可以作答了。 加油! 當然這只是其中一種解法 還有很多解法等你去發掘! 當然:程式碼在此: 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...

Zerojudge 基礎題庫d489 伏林的三角地

圖片
這題在知道海龍公式時非常簡單,但不知道的人真的會燒掉~ 因為他說平方後是整數,不代表沒平方時是整數。 像是 2 和 2^1/2 偏偏float無法表示無理數,所以用普通方法算出面積不是明智之舉。 所以提示只有一個: 海龍公式! s = (a+b+c) / 2 area^2 = s(s-a)(s-b)(s-c) 下面是程式碼: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include<iostream> using namespace std; int tri_area_power2 ( int a, int b, int c){ int s = (a + b + c) /2 ; return s * (s - a) * (s - b) * (s - c); } int main (){ int a,b,c; while (cin >> a >> b >> c){ cout << tri_area_power2(a,b,c) << endl; } }

Zerojudge 基礎題庫a001 哈囉

圖片
基本上,只要記得加重複測資即可 (while(){}) 程式碼: 1 2 3 4 5 6 7 8 #include <iostream> using namespace std; int main (){ string a; while ( cin >> a) cout << "hello, " << a << endl; }

Zerojudge 基礎題庫a022 迴文

圖片
回文的定義是: 正向,反向讀到的字串均相同。 有了這個天大的提示,腦子裡瞬間跳出: 1.把題目顛倒一下 2.判斷是否相等 例如hi,把它顛倒變成ih hi != ih,所以不是回文 那theht,把它顛倒變成theht theht == theht,所以它是回文 有了這個神提示,趕快好好思考吧 那如果還不知道,那就繼續往下看: (一) 如何儲存字串 你可以這樣: char a[1000]; cin >> a; 這樣你輸入hello a[0] a[1] a[2] a[3] a[4] a[5] a[6]   ...    h     e     l      l      o     \0 當然你也可以學學string,功能強大~ (二) 如何知道字串長度 每個字串最後都是\0,好好利用吧 當然,string 有方便的函數 (三) 如何顛倒字串 答案:第二個提示不是寫無聊的 (四) 我要程式碼! 好吧,只能參考喔,不要複製歐~ 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 #include <iostream> #include <cstring> using namespace std; int main () { char question[ 1000 ]; while (cin >> question){ //find \0 (put it in length) int length; for ( int i = 0 ; i <= 999 ; i ++ ) { if (questi...