本题要求按照规定格式打印前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;
}