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