技巧

看觀念題的方法

斐波那契數列 0 1 1 2 3 5 ...

int a = 0; b = 1; c = 0;
for (int i = 0; i < n; i++) {
    c = a + b;
    a = b;
    b = c;
}
c 會等於 第n個 斐波那契數列 的的值
/* -------------------------------------------------------------------------- */
int f(int n) {
    if (n == 0) return 0;
    if (n == 1) return 1;
    return f(n - 1) + f(n - 2);
}
f(n) 等於 第n個 斐波那契數列 的的值

排列

int f(int n, int k) {
    if (k == 0)
        return 1; 
    else if (k == 1)
        return n;  
    else
        return n * p(n - 1, k - 1);
}
f(5, 4) 會等於 n!/(n-k)!

組合

int f(int n, int k) {
    if (k == 0 || k == n)
        return 1;
    return c(n - 1, k - 1) + c(n - 1, k);
}
f(5,3) 會等於 n!/k!(n-k)!

求和

int c = 0;
for (int i = 1; i <= n; i++) {
    c += i;
}
c = [n(n+1)]/2

平方和

int c = 0;
for (int i = 1; i <= n; i++) {
    c += i*i;
}
c = [n(n+1)(2n+1)]/6

階乘

int c = 1;
for (int i = 1; i <= n; i++) {
    c *= i;
}

泡沫排序

for (int i = 0; i < n - 1; i++) {
    for (int j = 0; j < n - i - 1; j++) {
        if (arr[j] > arr[j + 1]) {
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}
/* -------------------------------------------------------------------------- */
for (int i = 0; i < n - 1; i++) {
    for (int j = i; j < n - 1; j++) {
        if (arr[j] > arr[j + 1]) {
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}
/* -------------------------------------------------------------------------- */
arr[j] > arr[j + 1] 小~大
arr[j] < arr[j + 1] 大~小

選擇排序

void f(int a[], int n) {
    int t;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (a[i] < a[j]) {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
    }
}
arr[i] < arr[j] 大~小
arr[i] > arr[j] 小~大

交換變數

a = a * b;
b = a / b; 
a = a / b;
/* -------------------------------------------------------------------------- */
a = a ^ b;
b = a ^ b;
a = a ^ b;
/* -------------------------------------------------------------------------- */
temp = a;
a = b;
b = temp;

河內塔

void f(int n, int a, int b, int c) {
    if (n == 1) {
        return;
    }
    f(n - 1, a, c, b);
    f(n - 1, b, a, c);
}

左直角三角形

for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= i; ++j) {
        cout << "*";
    }
    cout << endl;
}

右直角三角形

for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n - i; ++j) {
        cout << " ";
    }
    for (int j = 1; j <= i; ++j) {
        cout << "*";
    }
    cout << endl;
}

等腰三角形

for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n - i; ++j) {
        cout << " ";
    }
    for (int j = 1; j <= 2 * i - 1; ++j) {
        cout << "*";
    }
    cout << endl;
}

倒等腰三角形

for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n - i; ++j) {
        cout << " ";
    }
    for (int j = 1; j <= 2 * i - 1; ++j) {
        if (j == 1 || j == 2 * i - 1 || i == n) {
            cout << "*";
        } else {
            cout << " ";
        }
    }
    cout << endl;
}

輾轉相除法

int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}
//-----------------------
int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

帕斯卡三角形

int pas[6] = {1};
for(int i=0; i<6; i++) {
        int prev=0; // 用來暫存上一個元素
        for(int j=0; j<=i; j++) { 
            int tmp = pas[j]; 
            pas[j] = prev + pas[j];
            prev = tmp;
        }
}

Last updated

Was this helpful?