---
# System prepended metadata

title: zerojudge 基礎題庫練習
tags: [APCS]

---

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