# <font size=9>**C++考古題**</font>
# <font size=3 color=darkblue>**10601:**</font>
## 第一題
輸入列數後,輸出相對的圖形。
### 第一解:
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin >> n){
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
cout << "*";
}
cout << endl;
}
}
return 0;
}
```
**input**
```
6
```
**output**
```
*
**
***
****
*****
******
```
<Br>
### 第二解:
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin >> n){
for(int i=n;i>0;i--){
for(int j=0;j<i;j++){
cout << "*";
}
cout << endl;
}
}
return 0;
}
```
**input**
```
6
```
**output**
```
******
*****
****
***
**
*
```
<Br>
### 第三解:
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin >> n){
for(int i=1;i<=n;i++){
for(int j=0;j<n-i;j++)cout<<" "; //印空格
for(int k=0;k<i;k++)cout<<"*"; //印星號
cout<<endl;
}
}
return 0;
}
```
**input**
```
6
```
**output**
```
*
**
***
****
*****
******
```
<Br>
### 第四解:
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin >> n){
for(int i=1;i<=n;i++){
for(int k=1;k<i;k++)cout<<" "; //印空格
for(int j=n-i;j>=0;j--)cout<<"*"; //印星號
cout<<endl;
}
}
return 0;
}
```
**input**
```
6
```
**output**
```
******
*****
****
***
**
*
```
<Br>
## 第二題
假設某月份為 31 天,輸入該月份 1 日的星期數,輸出該月分之月曆。
```cpp=
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int weekday;
while(cin >> weekday){
for(int i=1;i<32;i++){
printf("某月%d日 星期%d\n",i,weekday); //cout << "某月"<<i<<"日 星期"<<weekday<<endl;
if(weekday==7)weekday=1;
else weekday++;
}
}
return 0;
}
```
## 第三題
輸入正整數 n,輸出如下數列,直到數字超過 n 為止。
1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5 ……
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin>>n){
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cout<<i<<",";
}
}
cout<<"\b \n";//游標退一格用空格把逗號吃掉再換行
}
return 0;
}
```
## 第四題
輸入正整數 n,輸出 n*n 乘法表。
```cpp=
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n;
while(cin>>n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d*%d=%d ",i,j,i*j);
}
cout<<"\n";
}
}
return 0;
}
```
## 第五題
輸入西元年、月、日,輸出此日期是該年的第幾天?。
* **西元年份除以4不可整除,為平年。**
**西元年份除以4可整除,且除以100不可整除,為閏年。**
**西元年份除以100可整除,且除以400不可整除,為平年**
**西元年份除以400可整除,為閏年。**
### 基本解法:
```cpp=
#include <iostream>
using namespace std;
int leap_year(int);
int year_day(int,int,bool);
int main()
{
int year,month,day;
while(cin >> year >> month >> day){
bool yes=leap_year(year); //紀錄leap_year回傳值
day=year_day(month,day,yes); //呼叫year_day來計算天數 並把計算結果回傳給day
cout<<day<<endl;
}
return 0;
}
int leap_year(int y){ //判斷閏年 如果是 回傳1 不是 回傳0
if(y%400==0)return 1;
else if(y%4==0&&y%100!=0)return 1;
else return 0;
}
int year_day(int m,int d,bool YoN){ //計算天數
if(YoN==0){ //平年天數計算
for(int i=1;i<m;i++){
switch(i){
case 2:
d+=28; // d+=28的意思是 d=d+28
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
d+=31;
break;
default:
d+=30;
break;
}
}
}else{ //閏年天數計算
for(int i=1;i<m;i++){
switch(i){
case 2:
d+=29;
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
d+=31;
break;
default:
d+=30;
break;
}
}
}
return d;
}
```
### 較短寫法:
```cpp=
#include <iostream>
using namespace std;
int leap_year(int);
int year_day(int,int,int);
int main()
{
int year,month,day;
while(cin >> year >> month >> day){
int yes=leap_year(year); //紀錄leap_year回傳值
day=year_day(month,day,yes); //呼叫year_day來計算天數 並把計算結果回傳給day
cout<<day<<endl;
}
return 0;
}
int leap_year(int y){ //判斷閏年 也就是判斷2月為幾天 如果是閏年 回傳29 不是 回傳28
if(y%400==0 || y%4==0 && y%100!=0)return 29;
else return 28;
}
int year_day(int m,int d,int YoN){ //計算天數
for(int i=1;i<m;i++){
switch(i){
case 2: //YoN = 主函式的yes變數 =判斷完是否為閏年的2月天數
d+=YoN;
break;
case 1: //大月
case 3:
case 5:
case 7:
case 8:
case 10:
d+=31;
break;
default: //小月
d+=30;
break;
}
}
return d;
}
```
## 第六題
請輸入一個字串(最多 10 個字元),將字串中的文字大小寫互換後輸出。
```cpp=
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main() {
char c;
string ENG;
while(cin >> ENG && sizeof(ENG)<=10){ //限制最多只能輸入10個字母
for(int i=0;i<=sizeof(ENG)+1;i++){
c=ENG[i]; //將字串內的字母拿出來單個看
if(c>=65&&c<=90)printf("%c",tolower(c)); //大寫轉小寫
else if(c>=97&&c<=122)printf("%c",toupper(c)); //小寫轉大寫
}
cout<<endl;
}
return 0;
}
```
## 第七題
輸入一些正整數(-1 代表結束),輸出這些整數中的最大值與最小值。
```cpp=
#include <iostream>
using namespace std;
int main() {
int num,max,min;
while(cin>>num){ //可以重複做 因為我也不知道祖鳳要的是啥 如果段考考這題這行就先不要寫
max=num;min=num;
while(cin>>num&&num!=-1){ //重複做直到-1輸出最大最小值
if(max<num)max=num;
if(min>num)min=num;
}
cout<<"max="<<max<<",min="<<min<<endl;
}
return 0;
}
```
## 第八題
輸入一些符號(a~z,0 代表結束),輸出各種符號出現的次數。
```cpp=
#include <iostream>
using namespace std;
int main()
{
char AtoZ;
int ENG[26]; //紀錄字母有幾個的陣列
for(int i=0;i<26;i++)ENG[i]=0; //陣列規0
while(cin >> AtoZ && AtoZ!='0'){
for(int i=0;i<26;i++){
if(AtoZ==char(i+97))ENG[i]++; //判斷輸入的字元是誰 並記錄出現幾次
}
}
for(int i=0;i<26;i++)cout << char(i+97) << "有" << ENG[i] << "個" << endl;
return 0;
}
```
## 第九題
輸入 n 個正整數(n<=10,-1 代表結束),以氣泡排序法輸出由小排到大的結果。
* [氣泡排序法教學](https://medium.com/@oturngo/study-note-01-%E6%B0%A3%E6%B3%A1%E6%8E%92%E5%BA%8F%E6%B3%95-bubble-sort-ee534b6f91eb)
```cpp=
#include <iostream>
using namespace std;
int main() {
int n[10];
for(int i=0;i<10;i++)n[i]=-1; //一開始全設-1待會比較方便
while(1){ //重複執行
for(int i=0;i<10;i++){ //輸入直到超過十個或輸入到-1
cin>>n[i];
if(n[i]==-1)break;
}
for(int i=0;i<10;i++){ //氣泡排序法 if前面的數比後一個數大就交換
for(int j=0;j<10;j++){
if(n[j]>n[j+1]){
int temp=n[j];
n[j]=n[j+1];
n[j+1]=temp;
}
}
}
for(int i=0;i<10;i++){ //輸出 if遇到-1就跳過
if(n[i]==-1)continue;
cout<<n[i]<<" ";
}
cout<<endl;
for(int i=0;i<10;i++)n[i]=-1; //將陣列全設為-1
}
return 0;
}
```
## 第十題
假設西元 2000 年 1 月 1 日為星期六。分三列輸入某年某月某日,輸出該日期是星期幾。
<font color=red>這題我用暴力解,所以如果不會沒關西</font>
<br>
:::spoiler <font color=darkblue>**點我顯示程式碼**</font>
```cpp=
#include <iostream>
using namespace std;
void low_year(int,int,int);
void high_year(int,int,int);
int main() {
int year,month,day;
while(cin>>year>>month>>day){
if(year>=2000){
high_year(year,month,day);
}else{
low_year(year,month,day);
}
}
return 0;
}
void low_year(int y,int m,int d){
int distance_day=0;
for(int i=y;i<2000;i++){
if(i%400==0 || i%4==0 && i%100!=0)distance_day+=366;
else distance_day+=365;
}
for(int i=1;i<m;i++){
switch(i){
case 4:
case 6:
case 9:
case 11:
d+=30;
break;
case 2:
d+=28;
break;
default:
d+=31;
break;
}
}
distance_day-=d; //到這邊是在計算距離1999/12/31有幾天
switch(distance_day%7){ //這邊我就暴力解 一個一個找條件 像是1999/12/31是星期五 然後她的餘數是0 所以0就是星期五
case 6:
cout<<"星期六"<<endl;
break;
case 5:
cout<<"星期日"<<endl;
break;
case 4:
cout<<"星期一"<<endl;
break;
case 3:
cout<<"星期二"<<endl;
break;
case 2:
cout<<"星期三"<<endl;
break;
case 1:
cout<<"星期四"<<endl;
break;
default:
cout<<"星期五"<<endl;
break;
}
}
void high_year(int y,int m,int d){
for(int i=2000;i<y;i++){
if(i%400==0||i%4==0&&i%100!=0)d+=366;
else d+=365;
}
for(int i=1;i<m;i++){
switch(i){
case 4:
case 6:
case 9:
case 11:
d+=30;
break;
case 2:
d+=28;
break;
default:
d+=31;
break;
}
}
if(m>2&&y%400==0||y%4==0&&y%100!=0)d++; //到這邊計算有幾天
switch(d%7){ //暴力解
case 2:
cout<<"星期日"<<endl;
break;
case 3:
cout<<"星期一"<<endl;
break;
case 4:
cout<<"星期二"<<endl;
break;
case 5:
cout<<"星期三"<<endl;
break;
case 6:
cout<<"星期四"<<endl;
break;
case 0:
cout<<"星期五"<<endl;
break;
default:
cout<<"星期六"<<endl;
break;
}
return;
}
```
:::
<br>
## 可樂題(CPE考題 祖鳳好狠)
簡單說就是你有n瓶可樂,可以跟老闆用三瓶空瓶換一瓶全新可樂,且可以跟老闆借瓶子,你總共可以喝的最大瓶數為幾瓶(我應該會先撐死)
<font size=3 color=darkpink>**以下是隔壁阿平速解**</font>
```cpp=
#include<iostream>
using namespace std;
int main(){
int n;
while(cin >> n){
cout << n+n/2 << endl;
}
return 0;
}
```
# <font size=3 color=darkblue>**11001:**</font>
## 第四題
輸入一個正奇數,若非正奇數,須繼續輸入。輸出 1 到此數的奇數和。
```cpp=
#include <iostream>
using namespace std;
int main() {
int n;
while(cin >> n){
if(n%2==0)continue;
int sum=0;
for(int i=1;i<=n;i+=2){
sum+=i;
}
cout << sum << endl;
}
return 0;
}
```
## 第五題
輸入一個十進位正整數,輸出相對應之二進位數字。
**如果想知道自己有沒有寫錯,可以點下面網址去試試,記得登入google帳號,登入才能送出解答**
[點我](https://zerojudge.tw/ShowProblem?problemid=a034)
```cpp=
#include <iostream>
using namespace std;
int main() {
int n,c=0;
int num[10000]={0};
while(cin >> n && n>-1){
for(int i=n;i>0;i/=2){ //紀錄二進位
num[c]=i%2;
c++; //紀錄二進位位置
}
for(int i=c-1;i>=0;i--){
cout<<num[i];
}
cout<<endl;
c=0;
}
return 0;
}
```
## 第七題
假設西元 2021 年 1 月 1 日為星期五。輸入 2021 年某月某日,
輸出
1. 該日期為星期幾
1. 該月份之月曆
<br>
:::spoiler <font color=darkblue>**點我顯示程式碼**</font>
```cpp=
#include<iostream>
using namespace std;
void whatday(int,int);
void monthly_calendar(int);
int main()
{
int month,day;
while(cin >> month >> day){
whatday(month,day);
monthly_calendar(month);
}
return 0;
}
void whatday(int m,int d){ //第一小題
int day=d;
for(int i=1;i<m;i++){
switch (i){
case 2:
d+=28;
break;
case 4:
case 6:
case 9:
case 11:
d+=30;
break;
default:
d+=31;
break;
}
}
switch (d%7){
case 1:
printf("2021/%d/%d為星期五\n",m,day);
break;
case 2:
printf("2021/%d/%d為星期六\n",m,day);
break;
case 3:
printf("2021/%d/%d為星期日\n",m,day);
break;
case 4:
printf("2021/%d/%d為星期一\n",m,day);
break;
case 5:
printf("2021/%d/%d為星期二\n",m,day);
break;
case 6:
printf("2021/%d/%d為星期三\n",m,day);
break;
default:
printf("2021/%d/%d為星期四\n",m,day);
break;
}
return;
}
void monthly_calendar(int m){ //印月曆
int d=1;
for(int i=1;i<m;i++){
switch (i){
case 2:
d+=28;
break;
case 4:
case 6:
case 9:
case 11:
d+=30;
break;
default:
d+=31;
break;
}
}
cout << m << "月" << "\n"<< " 一 二 三 四 五 六 日" << endl;
int whereday=0;
switch (d%7){
case 1:
cout << " 1";
whereday=5;
break;
case 2:
cout << " 1";
whereday=6;
break;
case 3:
cout <<" 1";
whereday=7;
break;
case 4:
cout <<" 1";
whereday=1;
break;
case 5:
cout <<" 1";
whereday=2;
break;
case 6:
cout << " 1";
whereday=3;
break;
default:
cout <<" 1";
whereday=4;
break;
}
for(int i=2;i<32;i++){
if(m==2 && i==29)break;
if(i==31)if(m==3||m==5||m==9||m==11)break;
if(whereday==7){
cout<<endl;
whereday=0;
}
if(i>=10){
cout << " " << i;
}else{
cout <<" " << i;
}
whereday++;
}
cout <<endl;
return;
}
```
:::
<br>
## 第八題
請先寫一個函數判斷整數是否為質數,函數中不能有輸入或輸出。並於主程式
輸入正整數 n,藉由呼叫此函數,輸出大於 1 且小於 n 的質數。
```cpp=
#include<iostream>
using namespace std;
bool prime(int);
int main(){
int n;
while (cin >> n){
for(int i=2;i<=n;i++){
bool YoN=prime(i); //i這個數是否為質數 "是" 為 "1" "否" 為 "0"
if(YoN==1)cout << i << " ";
}
cout << endl;
}
return 0;
}
bool prime(int n){ //n是否為質數 在寫程式習慣將 yes 為 1 no 為 0
for(int i=2;i<=n/2;i++){
if(n%i==0)return 0; //有被數字整除 回傳0 此時因為已經回傳值了 所以不論for迴圈有沒有跑完 皆會直接返回主函式
} //注意! 如果for迴圈跑完都沒吻合if的條件 才會跑到21行
return 1; //沒被任何數整除 回傳1
}
```
## 第九題
請寫一函數(function)計算整數次方,當傳入整數 $x$ ,則回傳整數 $x^x$ 。於主程式輸入整數 n(n<=10),藉呼叫此函數,輸出 $1^1+2^2+3^3+...n^n$ 的總和。
```cpp=
#include<iostream>
using namespace std;
int sum(int);
int main(){
int n,ans; //注意! 這邊的n 跟 sum 的 n 是不一樣的變數
while(cin >> n && n<=10){
ans=0;
for(int i=1;i<=n;i++){
ans=ans+sum(i);
}
cout<<ans<<endl;
}
}
int sum(int n){ //做n的n次方
int ans=1;
for(int i=1;i<=n;i++){
ans*=n; //如果n的值為2 這個for迴圈會做2次ans乘2的動作
} //也就是當for迴圈跑完時 ans為2的2次方
return ans;
}
```
## 第十題
輸入兩個正整數,判斷兩數相加過程中會發生幾次進位?
```cpp=
#include<iostream>
using namespace std;
int main(){
int n1,n2,ans=0;
while (cin >> n1 >> n2){
int sum=0;
while(n1>0||n2>0){
sum=n1%10+n2%10+sum;
if(sum>=10){
ans++;
sum=1;
}
n1/=10;
n2/=10;
}
cout << "ans=" << ans << endl;
ans=0;
}
}
```
<br>
# <font size=3 color=darkblue>**10701:**</font>
## 第四題
輸入正整數n,輸出各點數出現次數跟機率。
```cpp=
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
int n;
cout << "請輸入一個正整數:";
while(cin >> n){
srand(time(NULL));
int dice[6]={0};
for(int i=0;i<n;i++){
dice[rand()%6]++;
}
for(int i=0;i<6;i++){
cout << i+1 << "點 : " << dice[i] << "次,機率為 : " << dice[i]*100/n << "%\n";
}
cout << "請輸入一個正整數:";
}
return 0;
}
```
## 第五題
以<font color=red>**字串**</font>方式輸入兩個正整數(二位數)的運算式,輸出其答案。
**string解:**
```cpp=
#include <iostream>
#include <string>
using namespace std;
int main()
{
string r;
cout << "請輸入運算式:";
while(cin >> r){
int n1,n2;
n1=(r[0]-48)*10+(r[1]-48);
n2=(r[3]-48)*10+(r[4]-48);
cout << n1 << r[2] << n2 << " = ";
if(r[2]=='+')cout << n1+n2 << "\n請輸入運算式:";
else if(r[2]=='-')cout << n1-n2 << "\n請輸入運算式:";
else if(r[2]=='*')cout << n1*n2 << "\n請輸入運算式:";
else if(r[2]=='/')cout << n1/n2 << "\n請輸入運算式:";
}
return 0;
}
```
**字元陣列解:**
```cpp=
#include <iostream>
using namespace std;
int main()
{
char r[5];
cout << "請輸入運算式:";
while(cin >> r){
int n1,n2;
n1=(r[0]-48)*10+(r[1]-48);
n2=(r[3]-48)*10+(r[4]-48);
cout << n1 << r[2] << n2 << " = ";
if(r[2]=='+')cout << n1+n2 << "\n請輸入運算式:";
else if(r[2]=='-')cout << n1-n2 << "\n請輸入運算式:";
else if(r[2]=='*')cout << n1*n2 << "\n請輸入運算式:";
else if(r[2]=='/')cout << n1/n2 << "\n請輸入運算式:";
}
return 0;
}
```
## 第八題
以<font color=red>**字串**</font>輸入一些0~9的數,長度小於20,輸出各種數字出現的次數和總和,0次的勿輸出。
```cpp=
#include <iostream>
#include <string>
using namespace std;
int main()
{
string NUM;
cout << "請輸入一些數字:";
while(cin >> NUM){
int num[10]={0},sum=0;
for(int i=0;i<NUM.size()&&i<20;i++){
num[NUM[i]-48]++;
}
for(int i=0;i<10;i++){
if(num[i]>0){
cout << i << "有 " << num[i] << " 個\n";
sum=num[i]*i+sum;
}
}
cout << "總和為 : " << sum << "\n請輸入一些數字:";
}
return 0;
}
```
## 第十題
模擬橋牌發牌,輸出四位玩家所得13張牌,包含花色及點數(A=4 , K=3 , Q=2 , J=1 , 其它=0)。
我盡量打詳細點QQ
:::spoiler **陣列看不懂點這**
<br>
card陣列大概長這樣,每個花色的牌各有一張
左上SA在陣列表示card[0][0],看成座標就是(0,0)的位置,右上為(0,12)代表SK,在陣列表示card[0][12]
<br>
| | A |2 |3 | 4 | 5 |6 | 7 | 8 |9 | 10 | J |Q | K |
| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
| S | 1 | 1 |1|1| 1 |1|1| 1 |1|1| 1 |1|1|
|H| 1 | 1 |1|1| 1 |1|1| 1 |1|1| 1 |1|1|
|D| 1 | 1 |1|1| 1 |1|1| 1 |1|1| 1 |1|1|
|C| 1 | 1 |1|1| 1 |1|1| 1 |1|1| 1 |1|1|
▲ card尚未被抽卡前
<br>
當我從card也就是牌組中抽取一張牌,那該張牌在牌組所對應的位置就必須為0,並且將這張牌丟入玩家的牌組中,也就是將player_card這個陣列相對應的位置改為1,代表此張牌在玩家牌組中
<br>
| | A |2 |3 | 4 | 5 |6 | 7 | 8 |9 | 10 | J |Q | K |
| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
|S|0|0|0|0|0|0|0|0|0|0|0|0|0|
|H|0|0|0|0|0|0|0|0|0|0|0|0|0|
|D|0|0|0|0|0|0|0|0|0|0|0|0|0|
|C|0|0|0|0|0|0|0|0|0|0|0|0|0|
▲ player_card尚未有牌前
<br>
此時假如玩家抽到愛心6(H6),那就將玩家牌組相對應的位置改為1,並將牌組的H6改為0
| | A |2 |3 | 4 | 5 |6 | 7 | 8 |9 | 10 | J |Q | K |
| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
|S|0|0|0|0|0|0|0|0|0|0|0|0|0|
|H|0|0|0|0|0|1|0|0|0|0|0|0|0|
|D|0|0|0|0|0|0|0|0|0|0|0|0|0|
|C|0|0|0|0|0|0|0|0|0|0|0|0|0|
▲ player_card抽到愛心6
| | A |2 |3 | 4 | 5 |6 | 7 | 8 |9 | 10 | J |Q | K |
| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
| S | 1 | 1 |1|1| 1 |1|1| 1 |1|1| 1 |1|1|
|H| 1 | 1 |1|1| 1 |0|1| 1 |1|1| 1 |1|1|
|D| 1 | 1 |1|1| 1 |1|1| 1 |1|1| 1 |1|1|
|C| 1 | 1 |1|1| 1 |1|1| 1 |1|1| 1 |1|1|
▲ card愛心6被抽走
<br>
:::
<br>
```cpp=
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
srand(time(NULL));
char COLOR[4]={'S','H','D','C'}; //花色(輸出方便)
char card_number[13]={'A','2','3','4','5','6','7','8','9','10','J','Q','K'}; //A~K牌號(輸出方便)
int card[4][13]; //牌組 4為花色 13為牌號
for(int i=0;i<4;i++)for(int j=0;j<13;j++)card[i][j]=1; //將牌組全設 1 代表現在牌組4種花色13張牌皆在
for(int i=0;i<4;i++){
cout << "\n" << i+1 << " 號玩家:\n" ;//輸出幾號玩家
int player_card[4][13]={0}; //玩家手上的牌 初始為零
for(int j=0;j<13;){ //j用來記玩家拿到幾張牌
int number,color;
number=rand()%13; //隨機牌號
color=rand()%4; //隨機花色
if(card[color][number]==1){ //牌組是否有此花色和牌號的牌
player_card[color][number]=1; //將這張牌給玩家
card[color][number]=0; //拿走牌組的牌
j++; //拿到牌所以加一
}
}
int num=0; //用來計點
for(int j=0;j<4;j++){
cout << COLOR[j] << ":"; //輸出該花色
for(int k=0;k<13;k++){
if(player_card[j][k]==1){ //玩家是否有該花色第k號的牌
cout << card_number[k] << " " ;//輸出該牌號
if(k==0)num+=4;//計點 A=4
else if(k==10)num+=1; //J=1
else if(k==11)num+=2; //Q=2
else if(k==12)num+=3; //K=3
}
}
cout << endl;
}
cout << "點數為 : " << num << endl;//輸出點數
}
return 0;
}
```
## 第十一CPE題
就找a,b區間是某數平方的數。
```cpp=
#include <iostream>
using namespace std;
int main()
{
int a,b;
while(cin >> a >> b){
for(int i=1;i*i<=b;i++){
if(i*i>=a)cout << i*i << " ";
}
cout << endl;
}
return 0;
}
```
# <font size=3 color=darkblue>10801</font>
## 第六題
輸入兩個正整數,輸出進位幾次
```cpp=
#include <iostream>
using namespace std;
int main()
{
int a,b;
while(cin >> a >> b){
int c=0,ans=0;
while(a!=0||b!=0){
c=(a%10+b%10+c)/10;
ans=ans+c;
a/=10;
b/=10;
}
cout << ans <<endl;
}
return 0;
}
```
## 第十題
輸入十進位,輸出4進位
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n;
while (cin >> n){
int i,num[10000]={0};
for(i=0;n>0;i++){
num[i]=n%4;
n/=4;
i++;
}
for(int j=i-1;j>=0;j--){
cout << num[j];
}
cout <<endl;
}
return 0;
}
```
## 第十三題
隨機1~100亂數,使用者輸入數字,若猜錯,提示太大OR太小,直到錯超過五次
```cpp=
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
srand(time(NULL));
int n;
while(1){
int i,number=rand()%100+1;
for(i=0;i<5;i++){
cout << "輸入1~100數字:";
cin >> n;
if(number==n){
cout << "答對啦" <<endl;
break;
}
else if(number>n)cout<< "太小\n";
else cout << "太大\n";
}
if(i==5)cout << "可惜沒答對,答案是" << number <<endl;
else cout << "恭喜答對啦,答案是" << number <<endl;
}
return 0;
}
```
# <font size=3 color=darkblue>11001-02</font>
## 第十二題
設計\*A\*B 之遊戲, 規則如下:
步驟 1:由電腦隨機產生四位數供使用者猜測,其中數字不可重複,請輸出此四位數。
步驟 2:由使用者輸入所猜測的四位數。
步驟 3:若位置與數字皆正確則回應 A, 若數字正確但位置錯誤則回應 B。
步驟 4:重複以上兩個步驟,直到答對(發生 4A)或猜測超過五次為止。
```cpp=
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(){
srand(time(NULL));
while(1){
int ans_number[9];
for(int n=0;n<9;n++)ans_number[n]=1;
int i,ans[4]={0};
cout << endl;
for(int i=0;i<4;){
int a=rand()%9+1;
if(ans_number[a-1]==1){
ans[i]=a;
cout << ans[i];
i++;
ans_number[a-1]=0;
}
}
for(i=0;i<5;i++){
cout << "\n輸入四位數字 :";
int player_ans;
cin >> player_ans;
int A=0,B=0;
for(int j=3;j>=0;j--){
if(ans[j]==player_ans%10)A++;
else {
for(int k=3;k>=0;k--){
if(j==k)continue;
if(player_ans%10==ans[k]){
B++;
break;
}
}
}
player_ans/=10;
}
if(A==4){
cout << "恭喜你答對囉,答案是 " ;
for(int s=0;s<4;s++)cout << ans[s];
break;
}else{
cout << "差一點, " << A << " A " << B << " B " << endl;
}
}
if(i==5){
cout << "次數沒囉,答案是 ";
for(int s=0;s<4;s++)cout << ans[s];
}
}
return 0;
}
```
<br><Br><br>
# <font size=3 color=darkblue>111年期末</font>
## 第六題
輸入長度小於100的字串,輸出出現幾次"mcu"
**input(方便看清楚所以我把mcu標出來):**
```
ajhfopawio'mcu'akjflkd'mcu'afjkal
```
**output:**
```
2次
```
```cpp=
#include <iostream>
#include <string>
using namespace std;
int main()
{
string r;
while(cout << "請輸入字串:",cin >> r){
int ans=0;
for(int i=0;i<100&&i<r.size();i++){
if(r[i]=='m'){
i++;
if(r[i]=='c'){
i++;
if(r[i]=='u')ans++;
}
}
}
cout << ans <<"次\n";
}
return 0;
}
```
<BR>
## 第七題(1)
輸出2022月曆
老樣子開爆(˘•ω•˘)
**output:**
```
一月 二月 三月 四月
...
五月 六月 七月 八月
...
九月 十月 十一月 十二月
...
```
**code :**
:::spoiler <font color=darkblue>點我</font>
```cpp=
#include <iostream>
using namespace std;
int main()
{
int ans[6][28];
int n;
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int Enter[13]={0,6,13,20,27,6,13,20,27,6,13,20,27};
while(cout << "隨機輸入數:",cin >> n){
for(int i=0;i<28;i++)for(int j=0;j<6;j++)ans[j][i]=0;
int enter=6,temp=0;
for(int i=1;i<=4;i++){
for(int j=1;j<=mon[i];j++){
if(enter>Enter[i]){
enter=0+7*(i-1);
temp++;
}
ans[temp][enter]=j;
enter++;
}
enter+=7;
temp=0;
}
enter-=28;
cout << "一月 \t二月 \t三月 \t四月\n";
cout << "日 一 二 三 四 五 六 \t日 一 二 三 四 五 六 \t日 一 二 三 四 五 六 \t日 一 二 三 四 五 六 \n";
for(int i=0;i<6;i++){
for(int j=0;j<28;j++){
if(ans[i][j]==0)cout << " ";
else if(ans[i][j]>=10)cout << ans[i][j] <<" ";
else if(ans[i][j]<10)cout << " " << ans[i][j] <<" ";
if(j==6||j==13||j==20)cout << "\t";
}
cout<<endl;
}
cout << endl;
for(int i=0;i<28;i++)for(int j=0;j<6;j++)ans[j][i]=0;
for(int i=5;i<=8;i++){
for(int j=1;j<=mon[i];j++){
if(enter>Enter[i]){
enter=0+7*(i-5);
temp++;
}
ans[temp][enter]=j;
enter++;
}
enter+=7;
temp=0;
}
enter-=28;
cout << "五月 \t六月 \t七月 \t八月\n";
cout << "日 一 二 三 四 五 六 \t日 一 二 三 四 五 六 \t日 一 二 三 四 五 六 \t日 一 二 三 四 五 六 \n";
for(int i=0;i<6;i++){
for(int j=0;j<28;j++){
if(ans[i][j]==0)cout << " ";
else if(ans[i][j]>=10)cout << ans[i][j] <<" ";
else if(ans[i][j]<10)cout << " " << ans[i][j] <<" ";
if(j==6||j==13||j==20)cout << "\t";
}
cout<<endl;
}
cout << endl;
for(int i=0;i<28;i++)for(int j=0;j<6;j++)ans[j][i]=0;
for(int i=9;i<=12;i++){
for(int j=1;j<=mon[i];j++){
if(enter>Enter[i]){
enter=0+7*(i-9);
temp++;
}
ans[temp][enter]=j;
enter++;
}
enter+=7;
temp=0;
}
cout << "九月 \t十月 \t十一月 \t十二月\n";
cout << "日 一 二 三 四 五 六 \t日 一 二 三 四 五 六 \t日 一 二 三 四 五 六 \t日 一 二 三 四 五 六 \n";
for(int i=0;i<6;i++){
for(int j=0;j<28;j++){
if(ans[i][j]==0)cout << " ";
else if(ans[i][j]>=10)cout << ans[i][j] <<" ";
else if(ans[i][j]<10)cout << " " << ans[i][j] <<" ";
if(j==6||j==13||j==20)cout << "\t";
}
cout<<endl;
}
}
return 0;
}
```
:::
<BR>
## 第七題(2)
輸入年分,輸出該年月曆
<BR>
<br><br><br>
# <font size=3 color=darkblue>11202-02</font>
## 第一題
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
for (int i = 1; i <= n; i++)
{
for (int j = (n - i); j > 0; j--) cout << " ";
for (int k = 0; k < i; k++) cout << "*";
cout << endl;
}
}
}
```
## 第二題
```cpp=
#include <iostream>
using namespace std;
int fib(int i)
{
if (i == 0) return 1;
if (i == 1) return 1;
return fib(i - 1) + fib(i - 2);
}
int main()
{
int n;
while (cin >> n)
{
for (int i = 0; i < n; i++)
{
cout << fib(i) << ", ";
}
cout << endl;
}
}
```
## 第三題
```cpp=
#include <iostream>
using namespace std;
bool prime(int n)
{
if (n == 2)
return true;
for (int i = 2; i < n; i++)
if (n % i == 0)
return false;
return true;
}
int main()
{
int n;
while (cin >> n)
{
int c = 0;
for (int i = 2;; i++)
{
if (prime(i))
{
cout << i << ", ";
c++;
}
if (c == n)
break;
}
}
}
```
## 第四題
```cpp=
#include <iostream>
#include <string>
using namespace std;
int main()
{
int ds[] = {0, 31, 28, 31, 30, 31, 30
, 31, 31, 30, 31, 30, 31};
string s[] = {"Sat", "Sun", "Mon", "Tue", "Wed", "Thr", "Fri"};
int m, d;
// assume 2011/1/1 is saturday
while (cin >> m >> d)
{
int days = 0;
if (m > 1)
for (int i = 1; i < m; i++)
days += ds[i];
days += d;
days -= 1;
cout << s[days % 7] << endl;
}
}
```
## 第五題
```cpp=
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int main()
{
string s;
while (cin >> s)
{
string suits[] = {"S", "H", "D", "C"};
vector<int> cards(52);
for (int i = 0; i < cards.size(); i++) cards[i] = i;
random_shuffle(cards.begin(), cards.end());
char p = 'A';
int c = 0;
for (int i = 1; i <= cards.size(); i++)
{
if (i % 13 == 1) cout << p++ << endl;
int card_idx = i - 1;
int card = cards[card_idx];
int suit = card / 13;
card %= 13;
cout << suits[suit];
if (card == 0) cout << "A", c += 4;
else if (card == 10) cout << "J", c += 1;
else if (card == 11) cout << "Q", c += 2;
else if (card == 12) cout << "K", c += 3;
else cout << card;
cout << " ";
if (i % 13 == 0) cout << endl << "points: " << c << endl, c = 0;
}
}
}
```
## 第六題
輸入兩個字串,先分別倒置內容,再合併一個字串輸出。
```cpp=
#include <iostream>
#include <string>
using namespace std;
int main()
{
string n1,n2;
while(cin >> n1 >> n2){
for(int i=0;i<n1.size();i++)cout << n1[i];
cout << endl;
for(int i=0;i<n2.size();i++)cout << n2[i];
cout << endl;
for(int i=0;i<n1.size();i++)cout << n1[i];
for(int i=0;i<n2.size();i++)cout << n2[i];
cout << endl;
}
return 0;
}
```
string algorithm 解
```cpp=
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string a, b;
while (getline(cin, a) && getline(cin, b))
{
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
cout << a + b;
}
}
```
## 第七題
輸入一正整數n(代表個數)及n個正整數,用動態記憶體儲存n個正整數,輸出由大到小的排序結果。
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin >> n){
int *p=new int[n];
for(int i=0;i<n;i++)cin >> p[i];
for(int i=0;i<n;i++)for(int j=i+1;j<n;j++){
if(p[i]<p[j]){
int t=p[i];
p[i]=p[j];
p[j]=t;
}
}
for(int i=0;i<n;i++)cout << p[i]<<" ";
cout <<endl;
delete[] p;
}
return 0;
}
```
algorithm 解
```cpp=
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
int *p;
while (cin >> n)
{
p = new int[n];
int m;
for (int i = 0; i < n; i++) cin >> m, *p = m, p++;
p -= n;
sort(p, p + n, greater<int>());
for (int i = 0; i < n; i++) cout << *p << ", ", p++;
delete[] p;
}
}
```
## 第八題
```cpp=
#include <iostream>
using namespace std;
class Watch
{
private:
int hour;
int minute;
int second;
public:
Watch(int h = 0, int m = 0, int s = 0)
{
this -> hour = h;
this -> minute = m;
this -> second = s;
}
void print()
{
printf(
"%02d:%02d:%02d\n",
this -> hour,
this -> minute,
this -> second
);
}
void reset(int h, int m, int s)
{
this -> hour = h;
this -> minute = m;
this -> second = s;
}
};
int main()
{
Watch w1, w2(10, 25, 30);
w1.print();
w2.print();
w2.reset(15, 10, 20);
w2.print();
}
```
## 第九題
```cpp=
#include <iostream>
using namespace std;
class Real
{
private:
int a, b;
public:
Real(int n = 0, int m = 0)
{
this -> a = n;
this -> b = m;
}
void input()
{
cin >> this -> a
>> this -> b;
}
void add(Real R)
{
this -> a += R.a;
this -> b += R.b;
while (this -> b >= 10) this -> b %= 10, this -> a++;
}
void print()
{
cout << this -> a << "."
<< this -> b << endl;
}
};
int main()
{
Real r1, r2(36, 5);
r1.input();
r1.add(r2);
r1.print();
r2.print();
}
```
# <font size=3 color=darkblue>中山大學111程設考題(全英)</font>
有能力就試著自己寫寫看,沒能力看點英文也好
:::spoiler 題目













:::
<BR><BR><BR><BR><BR>
# <font size=3 color=darkblue>zerojudge練習題</font>
:::spoiler 難度表(點我)
| 難度 | 建議花的時間 |
| -------- | -------- |
| ★ | 1hr ~ 2hr |
| ★★ | 2hr ~ 4hr |
| ★★★ | 1hr ~ 2hr |
**暫時沒3星以上題目,3星建議時間比較短是因為我覺得沒人會像我一樣發瘋想好幾天題目,如果有題目比3星的難我卻打2星的,請見諒<font color= #F8F8FF>因為我覺得都很簡單(被揍) 居然看到這行你也是蠻猛</font>**
:::
<br>
:::spoiler 億點建議(點我)
<br>
**如果真的希望自己寫程式更好,建議不要直接看我的程式碼,可以先自己花時間試著寫寫看,把題目分解成好幾個小問題再解會比較容易,一題建議花個幾小時去解,至於要花多久寫可以參考難度表,嘎油~**
:::
<br>
## 數字翻轉
**標籤 : 迴圈、if**
**難度 : <font color=red>★☆</font>**
**題目 :** [點我](https://zerojudge.tw/ShowProblem?problemid=a038)
<font size=3 color=darkpink>**提示 :**
* **答案開頭不能為0**
* **輸入值如果為0,要輸出0**
</font>
<br>
:::spoiler <font color=darkblue>**點我顯示程式碼**</font>
```cpp=
#include <iostream>
using namespace std;
int main(){
int n,y;
while (cin >> n){
y=0;
if(n==0)cout<<0; //如果輸入值為0 輸出0
while(n){
if(n%10>0)y=1; //y用來判斷是否遇到第一個不為0的數
else if(y==0){
n/=10;
continue;
}
cout<<n%10;
n/=10;
}
cout << endl;
}
return 0;
}
```
:::
<BR>
## 求數列第 n 項
**標籤 : 迴圈**
**難度 : <font color=red>★</font>**
**題目 :** [點我](https://zerojudge.tw/ShowProblem?problemid=b558)
<br>
:::spoiler <font color=darkblue>**點我顯示程式碼**</font>
```cpp=
#include <iostream>
using namespace std;
int main(){
int n;
while(cin >> n){
int ans=1;
for(int i=0;i<n;i++){ //ans=n-1項,i=n-1
ans=ans+i; //第n項為n-1項加上n-1
}
cout << ans << endl;
}
return 0;
}
```
:::
<br>
## kevin戀愛攻略系列題-2 說好的霸王花呢??
**標籤 : 迴圈、if**
**難度 : <font color=red>★☆</font>**
**題目 :** [點我](https://zerojudge.tw/ShowProblem?problemid=b836)
<font size=3 color=darkpink>**提示 :**
* **有個測資要開long long int 才會過**
* **m有可能為0,m為0時須輸出Go Kevin!!**
</font>
<br>
:::spoiler <font color=darkblue>**點我顯示程式碼**</font>
```cpp=
#include <iostream>
using namespace std;
int main(){
long long int n,m; //為了讓測資過所以設long long int
while (cin >> n >> m){
if(m==0){ //如果m為0就輸出,m=0的意思是每次都只拔一個花瓣
cout << "Go Kevin!!" <<endl;
continue;
}
for(long long int i=1;n>0;i+=m){ //每次都拔花瓣直到花瓣數為0或負數
n-=i;
}
if(n==0)cout << "Go Kevin!!" <<endl; //拔完花瓣數為0
else cout << "No Stop!!" <<endl; //拔超過了
}
return 0;
}
```
:::
<br>
## 忘了東西的傑克
**標籤 : 迴圈、if**
**難度 : <font color=red>★</font>**
**題目 :** [點我](https://zerojudge.tw/ShowProblem?problemid=b572)
<br>
:::spoiler <font color=darkblue>**點我顯示程式碼**</font>
```cpp=
#include <iostream>
using namespace std;
int main(){
int N,H1,H2,M1,M2,M3;
while(cin >> N){ //要做幾遍
for(int i=0;i<N;i++){ //N為有幾行輸入
cin >> H1 >> M1 >> H2 >> M2 >> M3; //輸入
int time=M2-M1+(H2-H1)*60; //計算前後相差時間
if(time>=M3)cout << "Yes" << endl;
else cout << "No" << endl;
}
}
return 0;
}
```
:::
<br>
## 遞迴函數練習
**標籤 : 遞迴、if**
**難度 : <font color=red>★★★</font>**
**題目 :** [點我](https://zerojudge.tw/ShowProblem?problemid=e357)
<font size=3 color=darkpink>**提示 :**
* **遞迴就是函式呼叫自己**
</font>
<br>
:::spoiler <font color=darkblue>**點我顯示程式碼**</font>
```cpp=
#include <iostream>
using namespace std;
int f(int);
int main(){
int x;
while(cin >> x){
cout << f(x) << endl;
}
return 0;
}
int f(int x){
if(x==1)return 1; //x=1 f(x)=1
if(x%2==0)return f(x/2); //x=偶數 f(x)=f(x/2)
else return f(x-1)+f(x+1); //x=其他 f(x)=f(x-1)+f(x+1)
}
```
:::
<br>
## 免費停車 (Free Parking)
**標籤 : 迴圈、if**
**難度 : <font color=red>★★</font>**
**題目 :** [點我](https://zerojudge.tw/ShowProblem?problemid=e621)
<font size=3 color=darkpink>**提示 :**
* **用迴圈去跑每一個車位是否為免費車位**
</font>
<br>
:::spoiler <font color=darkblue>**點我顯示程式碼**</font>
```cpp=
#include <iostream>
using namespace std;
int main (){
int n,a,b,c;
while(cin >> n){
for(int i=0;i<n;i++){
cin >> a >> b >> c;
int yon=0; //紀錄是否有免費車位
for(int j=a+1;j<b;j++){
if(j%c!=0){ //如果這個車位沒被c整除就輸出
cout << j << " ";
yon=1;
}
}
if(yon==0)cout << "No free parking spaces."; //沒有免費車位
cout << endl;
}
}
}
```
:::
<br>
## 購物車(APCS題)
**標籤 : 迴圈、if**
**難度 : <font color=red>★★★</font>**
**題目 :** [點我](https://zerojudge.tw/ShowProblem?problemid=f579)
<font size=3 color=darkpink>**提示 :**
* **判斷a、b商品有沒有買到**
* **注意顧客可能會把商品放回去**
* **不一定要用陣列**
</font>
<br>
:::spoiler <font color=darkblue>**點我顯示程式碼**</font>
```cpp=
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a_goods,b_goods,n,take;
while(cin >> a_goods >> b_goods >> n){
int ans=0; //ans=有幾個顧客買a、b商品
for(int i=0;i<n;i++){
int list[2]={0}; //陣列紀錄a與b是否有被拿取 陣列分別為a商品與b商品拿的數量
while(cin >> take && take!=0){
if(take==a_goods)list[0]++; //拿a商品
if(take==b_goods)list[1]++; //拿b商品
if(take==-a_goods)list[0]--; //a商品放回架上
if(take==-b_goods)list[1]--; //b商品放回架上
}
if(list[0]>0 && list[1]>0)ans++; //a、b皆有拿
}
cout << ans << endl;
}
return 0;
}
```
:::
## Parity(CPE一顆星題)
**標籤 : 迴圈、if**
**難度 : <font color=red>★★</font>**
**英文題目 :** [點我](https://i.imgur.com/HnlxNkW.png)
**中文題目 :** [點我](https://zerojudge.tw/ShowProblem?problemid=a132)
<font size=3 color=darkpink>**提示 :**
* **注意0不能輸出東西**
</font>
<br>
:::spoiler <font color=darkblue>**點我顯示程式碼**</font>
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin >> n,n!=0){
int i,ans=0,num[10000]={0};
for(i=0;n>0;i++){
num[i]=n%2;
if(n%2==1)ans++;
n/=2;
}
cout<<"The parity of ";
for(i=i-1;i>=0;i--){
cout << num[i];
}
cout <<" is " << ans << " (mod 2).\n";
}
return 0;
}
```
:::
## Hashmat the Brave Warrior(CPE一顆星題)
**標籤 : 無**
**難度 : <font color=red>★</font>**
**英文題目 :** [點我](https://i.imgur.com/6ozsAoe.png)
**中文題目 :** [點我](https://zerojudge.tw/ShowProblem?problemid=a012)
<font size=3 color=darkpink>**提示 :**
* **變數最好開long long int**
* **變數取絕對值用 abs(變數)**
</font>
<br>
:::spoiler <font color=darkblue>**點我顯示程式碼**</font>
```cpp=
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
long long int m,n;
while(cin >> m >>n){
cout << abs(m-n) <<endl;
}
return 0;
}
```
:::
## Feynman
**標籤 : 迴圈**
**難度 : <font color=red>★</font>**
**中文題目 :** [點我](https://zerojudge.tw/ShowProblem?problemid=a111)
<font size=3 color=darkpink>**提示 :**
* **找到公式**
</font>
<br>
:::spoiler <font color=darkblue>**點我顯示程式碼**</font>
```cpp=
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int n;
while(cin >> n,n!=0){
int ans=0;
for(int i=1;i<=n;i++){
ans+=i*i;
}
cout << ans <<endl;
}
return 0;
}
```
:::
## TOI練習題
[題目](https://zerojudge.tw/ShowProblem?problemid=k466)