楊輝三角

zhm521314發表於2020-12-26

第一次嘗試

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define N 10

//正常排列的楊輝三角
int arr[N][2 * N - 1] = { 0 };
void YangHuiTriangle(int n) {
    int flag = 1;
    int mid = n;
    arr[0][n] = 1;
    for (int i = 1; i < n; i++) {
        if (flag == 1) {
            for (int j = 0, k = 1; j < (i + 1) / 2; j++, k += 2) {
                arr[i][n - k] = arr[i - 1][n - k - 1] + arr[i - 1][n - k + 1];
                arr[i][n + k] = arr[i - 1][n + k - 1] + arr[i - 1][n + k + 1];
            }
        }
        if (flag == -1) {
            for (int j = 0, k = 0; j <= i / 2; j++, k += 2) {
                arr[i][n - k] = arr[i - 1][n - k - 1] + arr[i - 1][n - k + 1];
                arr[i][n + k] = arr[i - 1][n + k - 1] + arr[i - 1][n + k + 1];
            }
        }
        flag = -flag;
    }
}

void print(int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 2 * n ; j++) {
            if (arr[i][j] != 0) {
                printf("%2d", arr[i][j]);
            }
            else {
                printf("  ");
            }
        }
        printf("\n");
    }
}

//不正規的楊輝三角,排列不好看
void yangHuiTriangle(int n)
{
    int data[30][30] = { 1 }; //第一行直接填好,播下種子

    int i, j;

    for (i = 1; i < n; i++) //從第二行開始填
    {
        data[i][0] = 1; //每行的第一列都沒有區別,直接給1,保證不會越界。
        for (j = 1; j <= i; j++) //從第二列開始填
        {
            data[i][j] = data[i - 1][j] + data[i - 1][j - 1]; //遞推方程
        }
    }

    for (i = 0; i < n; i++) //填完列印
    {
        for (j = 0; j <= i; j++)
        {
            printf("%d ", data[i][j]);
        }
        putchar('\n');
    }
}
//稍微改進,但是排列仍舊不夠好看,不過由於是一維的,所以變簡單了,但是每次只能儲存最後一行的資料
void yangHuiTriangle1(int n)
{
    int data[30] = { 1 };

    int i, j;
    printf("1\n"); //第一行就直接列印了
    for (i = 1; i < n; i++) //從第二行開始
    {
        for (j = i; j > 0; j--) //從後向前填,避免上一行的資料在使用前就被覆蓋
        {
            data[j] += data[j - 1]; //公式同上,由於變成了一維,公式也變簡單了。
        }

        for (j = 0; j <= i; j++) //這一行填完就直接列印了。
        {
            printf("%d ", data[j]);
        }
        putchar('\n');
    }
}

int main() {
    printf("請輸入想要列印的行數:");
    int n = 0;
    scanf("%d", &n);
    YangHuiTriangle(n);
    print(n);
    //yangHuiTriangle(n);
    //yangHuiTriangle1(n);
    return 0;
}

本次程式碼,寫了三種不同的方法,第一種是我最滿意的,完整列印了楊輝三角,包括排列的位置,第二種和第三種不夠成熟,雖然列印出了楊輝三角,但是排列不夠完美,第三種是最簡單的一種,永遠只保留最後一行,然後運算之後替換成下一行。


部落格園發表於 2020-11-11 17:46

相關文章