# zerojudge 基礎題庫練習 ###### tags: `APCS` :::info **APCS 11101 筆試 :** https://hackmd.io/@algoseacow/APCS11101-writing#APCS-11101-%E7%AD%86%E8%A9%A6 **APCS 2021/11/7(110/11) 題解整理 C++** https://andyli.tw/apcs-2021-11/ **APCS 2021.11.07** https://hackmd.io/@peienwu/APCS1107 **APCS歷次試題實作題** https://medium.com/%E5%8D%81%E7%99%BE%E5%8D%83%E5%AF%A6%E9%A9%97%E5%AE%A4/apcs-%E6%AD%B7%E6%AC%A1%E8%A9%A6%E9%A1%8C%E5%AF%A6%E4%BD%9C%E9%A1%8C-5a225a801877 **APCS【2022年1月】題解整理** https://andyli.tw/apcs-11101/ **STEAM 教育學習網** https://steam.oxxostudio.tw/category/python/zerojudge/a149.html **basic-contents.md** https://github.com/Offliners/ZeroJugde-writeup/blob/master/%E5%9F%BA%E7%A4%8E%E9%A1%8C%E5%BA%AB/basic-contents.md ::: # a !!! ## a001: 哈囉 ![](https://i.imgur.com/HfRD7ZC.png) ```python= n=str(input()) if(n!=""): print('hello,',n) ``` ## a002: 簡易加法 ![](https://i.imgur.com/DH3xBth.png) ```python= a,b=map(int,input().split()) print(a+b) ``` ## a003: 兩光法師占卜術 ![](https://i.imgur.com/PlgTGqG.png) ```python= m,d=map(int,input().split()) temp=(m*2+d)%3 if(temp==0): print('普通') if(temp==1): print('吉') if(temp==2): print('大吉') ``` ## a004: 文文的求婚 ![](https://i.imgur.com/V6T1Nfb.png) ```python= while True: try: y = int(input()) if ((y%4==0) and (y%100!=0)) or (y%400==0): print("閏年") else: print("平年") except: break ``` ## a005: Eva 的回家作業 ![](https://i.imgur.com/mNtLyCQ.png) ```python= n=int(input()) for i in range(n): m=list(map(int,input().split())) if(m[3]-m[2]==m[2]-m[1]): ans=m[3]+(m[3]-m[2]) else : ans=m[3]*(m[3]//m[2]) print(m[0],m[1],m[2],m[3],ans) ``` ## a006: 一元二次方程式 ![](https://i.imgur.com/DCeF4G6.png) ```python= a,b,c=map(int,input().split()) if(b**2-4*a*c==0): x=int(-b/(2*a)) print(f"Two same roots x={x}") elif b**2 - 4*a*c > 0: x = -b / (2*a) y = (b**2 - 4*a*c) ** 0.5 / (2*a) x1 = int(x + y) x2 = int(x - y) print(f"Two different roots x1={x1} , x2={x2}") else: print("No real root") ``` ## a009: 解碼器 ![](https://i.imgur.com/rLVdED3.png) ```python= n=str(input()) for i in range(0,len(n)): if(i==' '): print(" ",end="") else : print(chr(ord(n[i])-7),end="") ``` ## a010: 因數分解 ![](https://i.imgur.com/mVPD9Eo.png) ```python= import sys lines = sys.stdin.readlines() #讀取單行資料 for line in lines: n = int(line) ans = "" first = True for b in range(2, n+1): # 判斷是否有2個質因數以上 p = 0 while n % b == 0: # 同樣得數字有幾次方 p += 1 n //= b if p: if first: first = False else: #不是第一次輸出數字 ans += " * " if p > 1: ans += f"{b}^{p}" else: ans += f"{b}" if n == 1: break; print(ans) ``` ```c++= //c++ int main() { int n; while(scanf("%d",&n)!=EOF){ int factor=2; bool first_print=true; //是不是只有一個質因數 while(n!=1){ //質因數分解 if(n%factor==0){ int pow=0; //計算次方 while(n%factor==0) { n/=factor; pow++; //次方數增加 } if(first_print) first_print=false; //下一次就不是第一次了 else printf("*") if(pow>1) printf("%d^%d",factor,pow); else printf("%d",factor); } else { factor++; } } } } ``` ## a013: 羅馬數字 ![](https://i.imgur.com/mi9CJpK.png) ```python= def translate_to_numbers(num): '''將羅馬數字轉換成阿拉伯數字''' # numbers : 轉換規則 numbers = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000} # x1_list : 存放轉換計算過程 x1_list = [] # sum1 : 轉換後的阿拉伯數字 sum1 = 0 # 將羅馬數字轉換成串列 for i in num: x1_list.append(i) # 將各個羅馬數字變成數字,使用numbers字典 for i in range(len(x1_list)): # 0 ~ x1_list end (int) x1_list[i] = numbers[x1_list[i]] # 尋找需要使用減法的數字 for i in range(1, len(x1_list)): # 1 ~ x1_list end (int) if x1_list[i - 1] < x1_list[i]: #左邊小的話 x1_list[i - 1] = -x1_list[i - 1] #是減掉 # 把計算過程全部加總起來,放入sum1 for i in range(len(x1_list)): sum1 += x1_list[i] # 回傳答案 return sum1 def roma(num): '''將阿拉伯數字轉換成羅馬數字''' # x : 問題 x = num # 分別存入千、百、十、個位數到thousand,hundred,ten,one裡 thousand = x // 1000 hundred = x % 1000 // 100 one = x % 10 ten = (x % 100 - one) // 10 # 將千位數以羅馬數字輸出 if thousand != 0: for i in range(thousand): print('M', end="") # 將百位數以羅馬數字輸出 if hundred != 0: if hundred <= 3: for i in range(hundred): print('C', end="") if hundred == 4: print("CD", end="") if hundred >= 5 and hundred != 9: print("D", end="") for i in range(hundred - 5): print("C", end="") if hundred == 9: print("CM", end="") # 將十位數以羅馬數字輸出 if ten != 0: # ten output if ten <= 3: for i in range(ten): print('X', end="") if ten == 4: print("XL", end="") if ten >= 5 and ten != 9: print("L", end="") for i in range(ten - 5): print("X", end="") if ten == 9: print("XC", end="") # 將個位數以羅馬數字輸出 if one != 0: if one <= 3: for i in range(one): print('I', end="") if one == 4: print("IV", end="") if one >= 5 and one != 9: print("V", end="") for i in range(one - 5): print("I", end="") if one == 9: print("IX", end="") while 1: x1 = input() # 當輸入為#時結束程式 if x1 == '#': break # 把輸入弄成我們需要的資訊(兩個羅馬數字) question = x1.split() x1 = question[0] x2 = question[1] # 兩個數字相減 ans1 = translate_to_numbers(x1) - translate_to_numbers(x2) # 做絕對值的動作 if ans1 < 0: ans1 = -ans1 # 當答案是0時輸出ZERO if ans1 == 0: print("ZERO", end="") else: roma(ans1) # 換行(格式需求) print() ``` ## a015: 矩陣的翻轉 ![](https://i.imgur.com/gcZhDud.png) ==**sys.stdin 輸入**== : **常見的是另外一種使用方式,可以直接使用檔案作為整體的輸入,可以很簡潔。** ```python= from sys import stdin for s in stdin: n,m=map(int,s.split()) k=[] for _ in range(n): k.append(stdin.readline().strip().split()) for i in range(0,m): for j in range(0,n): print(k[j][i],end=" ") print() ``` ## a017: 五則運算 蠻酷的網站: https://zrn-code.github.io/2020/10/18/a017/ ![](https://i.imgur.com/VPGnfyO.png) 題目 : 為了避免小數點誤差,所有的運算過程都不會產生小數點,可以放心使用整數進行運算 ```python= #py功能強大 整句放進去 就有ans while True: try: f = input().replace('/','//') # 將除法符號換成求整數 print(eval(f)) # 執行 eval() 求出結果 except: break ``` ## a020: 身分證檢驗 ![](https://i.imgur.com/r5xWAPi.png) ```python= while True: try: ans=0 m = {'A': 10, 'B': 11,'C':12,'D':13,'E':14,'F':15,'G':16,'H':17,'I':34,'J':18,'K':19,'L':20,'M':21,'N':22,'O':35,'P':23,'Q':24,'R':25,'S':26,'T':27,'U':28,'V':29,'W':32,'X':30,'Y':31,'Z':33} n=str(input()) temp=m[n[0]] ans+=(temp%10)*9 temp=temp//10 ans+=temp ans+=int(n[9])+int(n[8])*1+int(n[7])*2+int(n[6])*3+int(n[5])*4+int(n[4])*5+int(n[3])*6+int(n[2])*7+int(n[1])*8 if(ans%10==0) : print('real') else : print('fake') except: break ``` ## a021: 大數運算 ![](https://i.imgur.com/JA5VxY2.png) ```python= while True: try: s = input().replace('/','//') # 轉換成除法求整數 output = int(eval(f'{s}')) # 使用 eval() 直接計算結果 print(output) except: break ``` ## a022: 迴文 ![](https://i.imgur.com/Oe9vIMA.png) ```python= while True : try : n=str(input()) m=n m=''.join(reversed(m)) if(m==n): print('yes') else : print('no') except: break ``` ## a024: 最大公因數(GCD) ![](https://i.imgur.com/R8nGmn5.png) ```python= while True : try : a,b=map(int,input().split()) while(b!=0): temp=b b=a%b a=temp print(a) except: break ``` ## a034: 二進位制轉換 ![](https://i.imgur.com/JqFHAof.png) ```python= while True : try : n=int(input()) ans="" while(n!=0): ans+=str(n%2) n=n//2 print(''.join(reversed(ans))) except: break ``` ## a038: 數字翻轉 ![](https://i.imgur.com/QixQMyO.png) ```python= while True : try : n=str(input()) n=''.join(reversed(n)) print(int(n)) # # 轉換成數字輸出 ( 消除 0 ) except: break ``` ## a040: 阿姆斯壯數 ![](https://i.imgur.com/PBs9ZDD.png) ```python= while True : try : a,b=map(int,input().split()) f=False for i in range(a,b+1): s='' temp=0 s=str(i) for j in range(0,len(s)): temp+=int(s[j])**len(s) if(temp==i): print(temp,end=" ") f=True if(f==False): print('none') except: break ``` ## a042: 平面圓形切割 ![](https://i.imgur.com/qJj7Aeh.png) 套用「平面圓形切割」的公式,就能夠根據 n 求出有幾個區域。 平面圓形切割公式:**n^2-n+2** ```python= while True : try: n=int(input()) print(n**2-n+2) except: break ``` ## a044: 空間切割 ![](https://i.imgur.com/NF5P2qs.png) 題目會提供一個任意正整數 n,透過程式求出「空間中的 n 個平面,最多可將空間切成幾個區域」。 ![](https://i.imgur.com/pc1Arxf.png) 套用「空間切割」的公式,就能夠根據 n 求出有幾個區域。 ![](https://i.imgur.com/N8e4fDT.png) ```python= while True: try: n = int(input()) # 將輸入的文字轉換成數字 print(int((n**3+5*n+6)/6)) # 套用公式求出結果 except: break ``` ## a053: Sagit's 計分程式 ![](https://i.imgur.com/RDyAfuj.png) ```python= while True : try: n=int(input()) if(n>=0 and n<=10) : print(n*6) elif (n>10 and n<=20): print(60+(n-10)*2) elif (n>20 and n<=40): print(80+(n-20)*1) elif(n>40): print(100) except: break ``` ## a054: 電話客服中心 ![](https://i.imgur.com/3z1kswd.png) ```python= while True: try: # 建立字母與數字對照表 table = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15,'G':16,'H':17,'I':34, 'J':18,'K':19,'L':20,'M':21,'N':22,'O':35,'P':23,'Q':24,'R':25, 'S':26,'T':27,'U':28,'V':29,'W':32,'X':30,'Y':31,'Z':33} n = [int(i) for i in list(input())] # 將輸入的文字轉換成數字串列 s = 0 # 建立變數 s 作為計算使用 for i in range(8): s = s + n[i]*(8-i) # 根據公式算出 s for i in table: # 依序取出對照表內所有的字母與數字 a = [int(j) for j in list(str(table[i]))] # 將對應的數字轉換成數字串列,例如 11 轉換成 [1, 1] if n[8] == 0: # 如果檢查碼為 0,套用對應檢查公式 if (s + a[0] + a[1]*9)%10 == 0: # 如果字母對應的數字符合公式,印出該字母 print(i, end='') else: if 10 - (s + a[0] + a[1]*9)%10 == n[8]: # 如果字母對應的數字符合公式,印出該字母 print(i, end='') print() except: break ``` ## a058: MOD3 ![](https://i.imgur.com/oslmkhr.png) ```python= while True: try: n = int(input()) # 將輸入的文字轉換成數字 ( 再來會出現幾個數字 ) arr = [0, 0, 0] # 建立一個 [0, 0, 0] 的串列 for i in range(n): # 讓題目可以出現幾次數字 a = int(input()) # 將輸入的文字轉換成數字 if a%3 == 0: # 如果是 3 的倍數 arr[0] = arr[0] + 1 # arr 的第一項增加 1 if a%3 == 1: # 如果是 3 的倍數加 1 ( 除以 3 後餘數為 1 ) arr[1] = arr[1] + 1 # arr 的第二項增加 1 if a%3 == 2: # 如果是 3 的倍數加 2 ( 除以 3 後餘數為 2 ) arr[2] = arr[2] + 1 # arr 的第三項增加 1 for i in arr: print(i, end=' ') # 印出最後結果 except: break ``` ## a059: 完全平方和 ![](https://i.imgur.com/iEeWF8B.png) ```python= while True: try: n=int(input()) for i in range(0,n): ans=0 a=int(input()) b=int(input()) for j in range(1,100): if(j*j<=b and j*j>=a): ans+=(j*j) print(f'Case {i+1}: {ans}') except: break ``` ## a065: 提款卡密碼 ![](https://i.imgur.com/ldcXzmX.png) ```python= while True: try: n=str(input()) for i in range(1,len(n)): print(abs((ord(n[i])-ord(n[i-1]))),end="") except: break ``` ## a095: 麥哲倫的陰謀 ![](https://i.imgur.com/B8LsCws.png) ![](https://i.imgur.com/L4OfcVh.png) ```python= while True: try: n,m=map(int,input().split()) if(n>m and m>=1) : print(m+1) elif(n==m): print(m) except: break # 我戴什麼不知道,看到兩頂紅帽。 # 按照如果只有兩頂紅帽的情況,他們第二天應該會離開,但到了第三天都沒離開。 # 所以我知道他們兩個看到的一定不是只有一頂紅帽,所以我知道了自己是紅帽。 # 而另外兩個也是同樣想法,所以第三天紅帽就都離開了。 # 第四天,大家看到紅帽都離開了,知道了自己是白帽,也都離開了。 # 所以假設有X頂紅帽,全部犯人最晚會在X+1天知道自己的帽色。 # 但如果全部都是紅帽沒白帽,就會在X天知道自己的帽色。 ``` ## a104: 排序 ![](https://i.imgur.com/7FmnsNb.png) ```python= while True: try: n=int(input()) temp=list(map(int,input().split())) temp=sorted(temp) for i in range(n): print(f'{temp[i]}', end=' ') # 輸出 print() except: break ``` <!-- ```python= #include <iostream> #include <string> using namespace std; int main () { //n(ote) n(name)--音名 string nn[12] = {"C","C#","D","D#","E","F","F#","G","G#","A","A#","B"}; int n, i, k, sc[7] = {0,2,4,5,7,9,11}; //sc(ale)--大調音階 char ch; while (cin >> ch) { k = sc[(ch-'A'+5)%7]; //k(ey)--調名 if (cin.peek() == '#') //升半音 k++, cin.ignore(); cout << nn[k]; //輸出起始主音 n = 0; while (cin.peek() != '\n') { cin >> i; //輸入音程 i += (i<0) - (i>0); //扣掉起始音本身 n = (n + i + 49) % 7; //計算下一個音符 cout << ' ' << nn[(k+sc[n])%12]; //輸出音名 } cout << endl; } } ``` --> ## a121: 質數又來囉 ![](https://i.imgur.com/FT0CAVe.png) ```c++= //c++ #include <iostream> #include <cmath> using namespace std; int main() { int a, b, n; bool f; while (cin >> a >> b) { n = 0; if (a <= 1) a = 2; if (b < a){ cout << n << endl; continue; } for (int i=a; i<=b; i++) { f = true; for (int j=2; j<=sqrt(i); j++) { if (i % j == 0) { f = false; break; } } if (f) n++; } cout << n << endl; } } ``` ## a147: Print it all ![](https://i.imgur.com/MLb3lCr.png) ```python= while True : try : n=int(input()) if(n==0) : break for i in range(1,n): if(i%7!=0): print(i,end=' ') print() except: break ``` ## a148: You Cannot Pass?! ![](https://i.imgur.com/ova62Aj.png) ```python= while True : try : a=list(map(int,input().split())) temp=0 for i in range(1,len(a)): temp+=a[i] if(temp/a[0]>59) : print('no') else : print('yes') except: break ``` ## a149: 乘乘樂 ![](https://i.imgur.com/DYba5Ns.png) ```python= while True: try: n = int(input()) # 有幾組測試資料 for i in range(0, n): num = [int(i) for i in list(input())] # 使用串列生成式,轉換成數字串列 result = 1 # 新增 result 變數作為計算使用 for j in num: result = result * j # 計算串列中每個數字相乘的結果 print(result) print() except: break ``` ## a215: 明明愛數數 ![](https://i.imgur.com/Lxo6oa3.png) ```python= while True : try : a,b=map(int,input().split()) ans=0 c=0 for i in range(a,b): c+=1 ans+=i if(ans>b): break print(c) except: break #------------------------------------------------------- while True: try: n, m = map(int, input().split(' ')) # 使用 map 拆出 n 和 m 兩個數字 a = 0 # 新增 a 變數,預設為 0,記錄幾次 b = 0 # 新增 b 變數,預設為 0,負責運算加總 while True: a = a + 1 # 每次重複將 a 增加 1 b = b + n # 每次重複將 b 增加 n n = n + 1 # 每次重複將 n 增加 1 if b > m: # 如果加總後大於 m 就停止 break print(a) except: break ``` # e !!! ## e417: 乘法~乘法~加法~ ![](https://i.imgur.com/zc21IfC.png) ```c++= //c++ #include<iostream> using namespace std; int main(void) { int n, temp; while(scanf("%d", &n) != EOF) { long long int sum = 0; long long int result = 0; for(int i = 0; i < n; i++) { scanf("%d", &temp); result -= temp * temp; sum += temp; } printf("%lld\n", (result + sum * sum) / 2); } return 0; } //------------------------------------------------------- #include<iostream> #include<algorithm> using namespace std; int main() { int n=0; while(cin>>n){ int a[n]; for (int i=0;i<n;i++) { cin>>a[i]; } int ans=0; for (int i=0;i<n-1;i++) { for (int j=i+1;j<n;j++) { ans+=a[i]*a[j]; } } cout<<ans; } } ```