---
# System prepended metadata

title: 108題目(A卷)
tags: [C++複習講義]

---

---
tags: C++複習講義
---

# 108題目(A卷)



[回目錄](/jHU9MQS5QS-Uvs-ZS6CSxg)

:::success
為了幫(強)助(迫)各位思考，以下僅提供<font color=#f00>部分程式碼</font>，有任何問題歡迎私訊[資訊社IG](https://www.instagram.com/dzif_22nd_/?hl=zh-tw)。
程式碼內的 `__?__` 是刻意挖掉的，希望同學能先自行思考後將其還原
:::

## 1. 互質
>輸入兩正整數，判斷是否互質，若兩數不互質，輸出最大公因數。
兩數互質與否，可以取 2 個整數的最大公因數是否為 1 來判斷。「輾轉相除法」可以用來求取 2 數的最大公因數：

```cpp=
int a, b, r; //a 被除數，b 除數，r餘數

while(true) {
    cin >> a >> b;
    r = a % b;         // 以 % 取餘數
    while(__?__) {    
        a = b;
        b = r;
        r = a % b;
    }
    if(__?__) {
        cout << "互質" << endl;
    } else {
        cout << "不互質，最大公因數:" << __?__ <<endl;
    }
}
```

::: spoiler 參考答案
``` cpp
int a, b, r; //a 被除數，b 除數，r餘數

while(true) {
    cin >> a >> b;
    r = a % b;         // 以 % 取餘數
    while(r > 0) {
        a = b;
        b = r;
        r = a % b;
    }
    // 輾轉相除法的結果為最後一次除法的除數
    if(b == 1) {
        cout << "互質" << endl;
    } else {
        cout << "不互質，最大公因數:" << b <<endl;
    }
}
```
:::


## 2. 閏年

> 列出 2 個西元年份之間總共有哪些年份是閏年，最後再輸出此區間有幾次閏年。

判斷某年是否為閏年，則西元年份至少需滿足以下其中一個要求：

1. 西元年份可以被 4 整除，但不可被 100 整除者為閏年。
2. 西元年份可以被 400 整除者為閏年。

```cpp=
int a, b;       // a, b 為兩個年份
int count = 0;  // count 計算一共有幾個閏年

while( cin >> a >> b )
{
    // 西元年份除以4可整除，且除以100不可整除，為閏年。
    /* 西元年份除以400可整除，為閏年。*/
    for(int x = a; x <= b; x++) {
        if((x % 4 == 0 __?__ x % 100 != 0) __?__ x % 400 == 0) {
            cout << x << " ";
            count++;
        }
    }
    cout << endl << count << endl;
}
```

:::spoiler 參考答案
``` cpp=
int a, b;       // a, b 為兩個年份
int count = 0;  // count 計算一共有幾個閏年

while( cin >> a >> b )
{
    // 西元年份除以4可整除，且除以100不可整除，為閏年。
    /* 西元年份除以400可整除，為閏年。*/
    for(int x = a; x <= b; x++) {
        if((x % 4 == 0 && x % 100 != 0) || x % 400 == 0) {
            cout << x << " ";
            count++;
        }
    }
    cout << endl << count << endl;
}
```

- 條件1：可被 4 整除，但(而且)不得被 100 整除，以 `&&` 來連接 2 個條件
    ``` cpp
    x % 4 == 0 && x % 100 != 0
    ```
- 條件2：可被 400 整除
    ``` cpp
    x % 400 == 0
    ```
- 滿足條件1或條件2至少任何一項，以 `||` 來連接 2 個條件
    ``` cpp
    (x % 4 == 0  && x % 100 != 0) || x % 400 == 0
    ```
:::

## 3. 雞兔同籠

> 輸入籠子中雞和兔子的總腳數，輸出他們的所有組合




```cpp=
int n; // 一共n隻腳
while(cin>>n){
    int count=1; //count 計算第幾種可能
    int x, y; // x隻雞 y 隻兔
    for(x=0;__?__; x++){
        y=__?__;
        if(__?__){
            cout<<"第"<<count<<"種可能:"<<x<<"隻雞"<<y<<"隻兔"<<endl;
            count++;
        }
    }
}
```
:::spoiler 參考答案
```cpp=
int n; // 一共n隻腳
while(cin>>n){
    int count=1; //count 計算第幾種可能
    int x, y; // x隻雞 y 隻兔
    for(x=0;x<=n/2; x++){
        y=(n-2*x)/4;
        if(n==2*x+4*y){
            cout<<"第"<<count<<"種可能:"<<x<<"隻雞"<<y<<"隻兔"<<endl;
            count++;
        }
    }
}
```
> 設雞有x隻，兔有y隻，解2x+4y=n

:::

## 4. 級數
>輸入一整數N，若為偶數，計算級數一; 若為奇數，計算級數二，並輸出結果。
> 級數一: $2^1+4^3+...+N^{N-1}$
> 級數二: $\sqrt{1}+\sqrt{3}+...+\sqrt{N}$


```cpp=
int n; // 輸入一個數
while(cin>>n){
    float sum=0; // sum計算加總
    if(__?__){ //if偶數
        for(int x=2; x<=n; x+=2){
            sum+=__?__; 
        }
    }
    else{ //奇數
        for(int x=1; x<=n; x+=2){
            sum+=__?__;
        }
    }
    cout<<sum<<endl;
}
```
::: spoiler 參考答案
```cpp=
int n; // 輸入一個數
while(cin>>n){
    float sum=0; // sum計算加總
    if(n%2==0){ //if偶數
        for(int x=2; x<=n; x+=2){
            sum+=pow(x, x-1); //pow:次方 記得include<cmath>
        }
    }
    else{ //奇數
        for(int x=1; x<=n; x+=2){
            sum+=sqrt(x); //sqrt:根號
        }
    }
    cout<<sum<<endl;
}
```
:::