杨辉三角

第一次尝试
#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值