杨辉三角(C语言 + 两种方法实现 + 详细注释)

本题要求按照规定格式打印前N行杨辉三角。

输入格式:
输入在一行中给出N(1≤N≤10)。

输出格式:
以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。

输入样例:
6
输出样例:
        1
       1   1
      1   2   1
     1   3   3   1
    1   4   6   4   1
   1   5  10  10   5   1

//本体思路有两种:一:根据排列组合算出每一位;    二:每一行的数是上一行两数之和
   

//法一:第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
#include<stdio.h>
int fact(int x, int t);

int main() {
    int n, i;
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        int k = n - i - 1;
        while (k--)
            printf(" ");        /* 输出前导空格 */
        for (int j = 0; j <= i; j++)
            printf("%4d%s", fact(i, j) / fact(j, j), j < i ? "" : "\n");        // 排列组合法算出每一个值
    }
}

int fact(int x, int t) {        //写个函数计算 x * (x - 1) * (x - 2) ....(x - t + 1)
    int p, i;
    p = 1;
    while (t--) {
        p *= x;
        x -= 1;
    }
    return p;

}

//法二:每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个和第i个数之和,这也是组合数的性质之一。即 C(n+1,i)=C(n,i)+C(n,i-1)

#include<stdio.h>

int main() {
    int i, n, a[10][10], j;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        a[i][0] = a[i][i] = 1;    //首尾赋值为1

    for (i = 0; i < n; i++) {
        int k = n - i - 1;
        while (k--)
            printf(" ");        //输出前导空格
        for (j = 1; j < i; j++)
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];               
        for (j = 0; j < i + 1; j++)
            printf("%4d", a[i][j]);        
        printf("\n");
    }

    return 0;
}

发布了30 篇原创文章 · 获赞 10 · 访问量 415

猜你喜欢

转载自blog.csdn.net/qq_45472866/article/details/104046069
今日推荐