APCS 觀念題複習
注意:
觀念題40題只會取25題的分數,每題4分,剩下的不記分 (你還是不知道哪幾題計分,所以每題還是都很重要)
小技巧
因為每題平均下來只有3分鐘,所以要懂得分配時間:
只要你在一題花超過3分鐘,那就先跳過
那種要往下滑的題目我都先跳過
最後記得要回去寫和檢查
好好的利用你桌上那張紙:
可以用來記錄很多東西,請把東西都寫上去
我這裡只會帶每次都有考的題目,
而特殊的題目就看你的經驗 :)
類型轉換
總而言之:
看優先順序,目前做的和其他沒有關係
題目:
輸出什麼
int a = 2, b = 3;
int c = 4, d = 5;
int val;
val = b / a + c / b + d / b;
printf("%d\n", val);答案:
3
題目:
請問哪一個變數和其他的都不同
int a = 7, b = 3 ;
float w = a / 2 / b * 1.0 ;
float x = a / b / 2.0 ;
float y = a / 2 / b ;
float z = 1.0 * a / 2 / b ;答案:
z
視野 scope
簡單來說:
在main外的是全域變數
在函式內的是區域變數
若有名子相同有兩種,區域會先
題目:
已知
𝑎=31, 𝑏=3,試問輸出為何
(A) 31 28
(B) 34 28
(C) 31 3
(D) 34 31
void f(int a, int b) {
a = a + b;
b = a - b;
}
int main() {
int a = ____, b = ___;
f(a, b);
printf("%d %d\n", a, b);
}答案:
C
題目:
問輸出為何
(A) 3 7 17
(B) 5 7 17
(C) 3 3 17
(D) 3 7 8
int a = 5, b = 3 ;
void f(int a, int b) {
int c = a + b ;
}
int g(int a, int b) {
a = a + b ;
b = a - b ;
int c = a + b ;
return c ;
}
int main() {
int b = 7 ;
int c = g(a, b) ;
f(a, b) ;
int a = 3 ;
printf("%d %d %d\n", a, b, c) ;
}
答案:
A
if switch
if 考點:
-
基本的邏輯
-
沒括號的陷阱
沒括號:只會執行下一排,但是可以一直疊if else條件
switch 考點:
-
如果 case 中不加入 break 會無限下墜
-
現階段可以把 default 當作 else
for while
技巧:
用筆算一算,找規律
題目:
若 n 為正整數,下方程式三個迴圈執行完畢後 a 值將為何?
(A) 𝑛(𝑛+1)/2
(B) (𝑛^3)/2
(C) 𝑛(𝑛−1)/2
(D) (n^2)(n + 1) / 2
int a = 0, n;
// ...
for (int i = 1; i <= n; i = i + 1)
for (int j = i; j <= n; j = j + 1)
for (int k = 1; k <= n; k = k + 1)
a = a + 1;答案:
D
題目:
最後輸出
(A) 2417851639229258349412352 7
(B) 68921 43
(C) 65537 65539
(D) 134217728 6
int i = 2, x = 3;
int N = 65536;
while (i <= N)
{
i = i * i * i;
x = x + 1;
}
printf("%d %d \n", i, x);
答案:
D
遞迴
技巧:
用筆記錄每個步驟,要有耐心
題目:
給定下方 g() 函式,g(13) 回傳值為何?
(A) 16
(B) 18
(C) 19
(D) 22
int g(int a)
{
if (a > 1)
{
return g(a - 2) + 3;
}
return a;
}答案:
C
題目:
下方 g(4) 函式呼叫執行後
,回傳值為何?
(A) 6
(B) 11
(C) 13
(D) 14
int f(int n)
{
if (n > 3)
{
return 1;
}
else if (n == 2)
{
return (3 + f(n + 1));
}
else
{
return (1 + f(n + 1));
}
}
int g(int n)
{
int j = 0;
for (int i = 1; i <= n - 1; i = i + 1)
{
j = j + f(i);
}
return j;
}
答案:
C
二分搜
在這裡介紹三種二分搜的方法 (都要記):
左閉右開 (最常用):
while (l < r){
mid = (l+r)/2;
if (nums[mid] > a) r = mid;
else l = mid+1;
}
return r;左閉右閉:
while (l <= r){
mid = (l+r)/2;
if (nums[mid] > a) r = mid-1;
else l = mid+1;
}
return r;左開右開:
while (l+1 < r){
mid = (l+r)/2;
if (nums[mid] > a) r = mid;
else l = mid;
}
return r;bubble sort
基礎架構:(就是一直把錯的交換)
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
int n, nums[1005];
int main(){
ios::sync_with_stdio(0); cin.tie(0);
while (cin >> n){
for (int i=0; i<n; ++i) cin >> nums[i];
for (int i=0; i < n-1; ++i){
for (int j=0; j < n-i-1; ++j){
if (nums[j] > nums[j+1]) swap(nums[j], nums[j+1]);
}
}
for (int i=0; i<n; ++i){
if (i == n-1) cout << nums[i] << endl;
else cout << nums[i] << " ";
}
}
}
最大公因數 gcd
直接背: (輾轉相除法)
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
int a, b;
int gcd(int a, int b){
if (a%b == 0) return b;
else return gcd(b, a%b);
}
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin >> a >> b;
cout << gcd(a, b) << endl;
}
河內塔
#include <bits/stdc++.h>
using namespace std;
/*
河內塔 遞迴
1.將除掉最後一個的一疊 A移到B
2.將最後一個 A移到C
3.將除掉最後一個的一疊 B移到C
*/
int n;
//數量, 起點, 另一個點, 終點, 最上層的編號
void hanoi(int n, char A, char B, char C, int top){
if (n == 1){
cout << "Move ring " << top << " from " << A << " to " << C << endl;
return;
}
hanoi(n-1, A, C, B, 1);
hanoi(1, A, B, C, n);
hanoi(n-1, B, A, C, 1);
}
int main(){
ios::sync_with_stdio(0); cin.tie(0);
while (cin >> n){
hanoi(n, 'A', 'B', 'C', 1);
cout << endl;
}
}
簡易約瑟夫問題
下課
ya ok bye
APCS 觀念題複習
By MLGnotCOOL
APCS 觀念題複習
- 80