# 多元選修 上機考
## 第一題 : 吉祥數字
有一個小村落認為 7 是一個非常吉祥的數字,所以他們的數字比較皆
環繞在 7的身上。
● 今天若有兩數字,則兩數字中可以被 7 整除的比較大,如 140 比
52大,140為最吉祥數字
● 可以被 7 整除的數字中取 70 的餘數較大的比較大,如 28 會比
14 大,28為最吉祥數字
● 不能被 7 整除的數字中取 77 的餘數較小的比較大,如 15 會比
16 和 68 大,15為最吉祥數字
寫一個程式,求出這些數字中的最吉祥數字
輸入格式:
輸入為一連串的數字,範圍介在 1 至 1000 之間,以數字 0 代表這一串
數字的尾端,最多不超過 10 個數字,且 0 不列入須比較的範圍。
輸出格式:
依照該村落的數字比較大小規則,輸出給定數列中最大的數字,若有
多個最大的數字,請輸出最前面那一個。
範例:
輸入 7 14 28 0 ⇒輸出 28
輸入 7 77 777 0 ⇒輸出 7
輸入 52 140 0 ⇒ 輸出 140
輸入 15 16 68 0 ⇒ 輸出 15
```cpp=
#include <iostream>
using namespace std;
int main ()
{
int F[1000];
int ri, ci;
int flag = 0;
int output = 0;
for (ri = 1; ri <= 1000; ri++)
{
cin >> F[ri];
if (F[ri] == 0) {break;}
}
output = F[1];
for (ci = 2; ci < ri; ci++)
{
if (F[ci] % 7 == 0)
{
flag = 1;
if (output % 7 != 0) {output = F[ci];}
else if (F[ci] % 70 > output % 70) {output = F[ci];}
}
if (flag == 1) {continue;}
else
{
if (F[ci] % 77 < output % 77) {output = F[ci];}
}
}
cout << output;
return 0;
}
```
## 第二題 : 超級細菌繁殖
超級細菌王每過一天就會分裂出一個超級細菌,而分裂出來的超級細跟超
級細菌王一樣,每過一天也會再分裂出另一個超級細菌。
假設原先有一個超級細菌王,過了一天之後,就會變成一個超級細菌王以
及一個超級細菌;
過了兩天之後,超級細菌王會再分裂出一個超級細菌,另一個超級細菌也
會再產生另一個超級細菌,所以過了兩天之後,就會有一個超級細菌王以
及三個超級細菌。
寫一個程式,給定現在超級細菌王跟超級細菌的比例,計算出從開始到現
到現在,經過了幾天?
輸入格式:
輸入有一行,含有兩個整數 N 和 T,以一個空白隔開,
代表超級細菌王的數量:超級細菌的數量為=> N:T
輸出格式:
推算經過了幾天.
範例:
輸入 1 3 ⇒輸出 2
輸入 4 28 ⇒輸出 3
```cpp=
#include <iostream>
using namespace std;
int main ()
{
int boss, input, total;
int output;
cin >> boss >> input;
total = (boss + input) / boss;
while (1)
{
if (total / 2 != 1)
{
total /= 2;
output += 1;
}
else {break;}
}
cout << output;
return 0;
}
```
## 第三題 : 神奇數字
使用者輸入一個四位數字,請你幫他計算出屬於他的神奇數字。
條件如下:
● 如果是奇數,那麼千位數字和個位數字相加總和,再乘以百位數
字和十位數字相加總合。
● 如果是偶數,那麼千位數字和百位數字相乘,以及個位數字與十
位數字相乘,最後把二個相乘結果相加。
○ 若此條件有任一相乘結果為0,則神奇數字為所有數字相
加.
神奇數字不可以超過三位數字,即以上條之超過三位數字的話,只取
後面二位數字(十位字數和個位數字),神奇數字可以是二位數或一位
數。
若使用者輸入數字不是四位數字,必須重新輸入,直到輸入正確四位
數字為止,即只可以輸入1000 ~9999之間的數字,程式必須加以判斷
並要求輪入正確為止。
例如: 1746 : (1x7)+(4x6)=7+24=31
1745:(1+5)x(7+4)=6x11=66
9999:(9+9)x(9+9)=18x18=324 %100 =24
1000:1+0+0+0=1
2002:2+0+0+2=4
請你幫忙計算以下情況的神奇數字:
輸入格式:
1000
1746
1745
2002
9999
輸出格式:
1
31
66
4
24
```cpp=
#include<iostream>
using namespace std;
int main ()
{
int a, b, n;
int num;
cin >> n;
while(n > 9999 || n < 1000)
{
cin >> n;
}
if (n % 2 != 0)
{
a = n / 1000 + n % 10;
b = n / 100 % 10 + n % 100 / 10;
num = a * b;
}
else
{
a = (n / 1000) * (n / 100 % 10);
b = (n % 10) * (n % 100 / 10);
if (a == 0 || b == 0) {num = (n / 1000) + (n / 100 % 10) + (n % 10) + (n % 100 / 10);}
else {num = a + b;}
}
num = num % 100;
cout << num;
return 0;
}
```
## 第四題 : 青蛙跳躍
有一隻青蛙每次可以跳躍不一樣的距離,
假設一次可以跳躍的距離為 5 或 8,若目的地距離 97,那麼它可以藉
由跳五次距離 5 和九次距離 8 ,剛好到達目的地;
但若牠的目的地距離在11 則無法順利到達目的地(無法剛好跳躍到剛
好的目的地)
輸入格式
輸入只有一行,包含三個整數 N、M 和 D 。
N 和 M 表示青蛙可以跳躍的距離,D 表示目的地和牠的距離
輸出格式
若青蛙可以剛好到達目的地則輸出 YES,否則輸出NO
範例:
輸入 5 8 97 ⇒輸出 YES
輸入 5 4 1 ⇒輸出 NO
輸入 17 31 147 ⇒輸出 NO
```cpp=
#include<iostream>
using namespace std;
int main ()
{
int N, M, D;
int flag = 0;
int i;
int remain;
cin >> N >> M >> D;
for (i = 0; i <= (D / N); i++)
{
remain = D - i * N;
if (remain % M == 0)
{
flag = 1;
break;
}
}
if (flag == 1) {cout << "YES";}
else {cout << "NO";}
return 0;
}
```
## 第五題 : ASCII 編碼計算
一個文字統計器,希望能統計出文章中的英文字母大小寫各有
多少?請你寫一個程式,幫忙計算。
輸入格式:
由使用者一一輸入文字訊息,包含各種特殊符號、英文字母和阿拉伯數字
,最後輸入’=’鍵後結束。
輸出格式:
依序輸出英文字母(大小寫要分開計算,前面為大寫,後面小寫),各有多
少。
範例:
輸入
We are Rssh Senior High School students.=
輸出 5 28
輸入
1234+*5678ab=
輸出 0 2
輸入
There are 45 cars ,18 motors and 100 biks.=
輸出 1 24
```cpp=
#include<iostream>
using namespace std;
int main ()
{
int A = 0, a = 0, n = 0;
char i;
while (i != '=')
{
cin >> i;
if (i >= 'A' && i <= 'Z') {A++;}
else if (i >= 'a' && i <= 'z') {a++;}
else if (i >= '0' && i <= '9') {n++;}
}
cout << A << " " << a << " " << n << " ";
return 0;
}
```