# 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: 哈囉

```python=
n=str(input())
if(n!=""):
print('hello,',n)
```
## a002: 簡易加法

```python=
a,b=map(int,input().split())
print(a+b)
```
## a003: 兩光法師占卜術

```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: 文文的求婚

```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 的回家作業

```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: 一元二次方程式

```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: 解碼器

```python=
n=str(input())
for i in range(0,len(n)):
if(i==' '): print(" ",end="")
else : print(chr(ord(n[i])-7),end="")
```
## a010: 因數分解

```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: 羅馬數字

```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: 矩陣的翻轉

==**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/

題目 : 為了避免小數點誤差,所有的運算過程都不會產生小數點,可以放心使用整數進行運算
```python=
#py功能強大 整句放進去 就有ans
while True:
try:
f = input().replace('/','//') # 將除法符號換成求整數
print(eval(f)) # 執行 eval() 求出結果
except:
break
```
## a020: 身分證檢驗

```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: 大數運算

```python=
while True:
try:
s = input().replace('/','//') # 轉換成除法求整數
output = int(eval(f'{s}')) # 使用 eval() 直接計算結果
print(output)
except:
break
```
## a022: 迴文

```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)

```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: 二進位制轉換

```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: 數字翻轉

```python=
while True :
try :
n=str(input())
n=''.join(reversed(n))
print(int(n)) # # 轉換成數字輸出 ( 消除 0 )
except:
break
```
## a040: 阿姆斯壯數

```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: 平面圓形切割

套用「平面圓形切割」的公式,就能夠根據 n 求出有幾個區域。
平面圓形切割公式:**n^2-n+2**
```python=
while True :
try:
n=int(input())
print(n**2-n+2)
except:
break
```
## a044: 空間切割

題目會提供一個任意正整數 n,透過程式求出「空間中的 n 個平面,最多可將空間切成幾個區域」。

套用「空間切割」的公式,就能夠根據 n 求出有幾個區域。

```python=
while True:
try:
n = int(input()) # 將輸入的文字轉換成數字
print(int((n**3+5*n+6)/6)) # 套用公式求出結果
except:
break
```
## a053: Sagit's 計分程式

```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: 電話客服中心

```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

```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: 完全平方和

```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: 提款卡密碼

```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: 麥哲倫的陰謀


```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: 排序

```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: 質數又來囉

```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

```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?!

```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: 乘乘樂

```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: 明明愛數數

```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: 乘法~乘法~加法~

```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;
}
}
```