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] << " ";
        }
    }
}

會考的:bubble sort 交換幾次

 

答案:從一點往後找,如果順序錯的就加一次

(對就這樣沒有很難)

偷 :)

最大公因數 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