思路:
第一种:利用二维数组;
第二种:利用了它的排列组合的性质:第n行的第m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
二维数组法代码的实现:
#include <stdio.h>
/*二维数组法*/
int main(){
int n;
printf("input line:");
scanf("%d",&n);
/*杨辉三角n行有n个元素*/
int arr[n][n];
/*三角形两条腰上元素都是1*/
for(int i = 0;i < n;i++){
arr[i][0] = arr[i][i] = 1;
}
/*每行从第二个元素开始,都是上一行前一个元素和后一个元素之和*/
for(int i = 2;i < n;i++){
for(int j = 1;j < i;j++){
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
/*打印三角形*/
for(int i = 0;i < n;i++){
/*三角形左边的空格*/
for(int j = 0;j < n-i;j++){
printf(" ");
}
/*跟在空格后打印每行的元素*/
for(int k = 0;k < i+1;k++){
printf("%6d",arr[i][k]);
}
putchar('\n');
}
return 0;
}
组合法代码的实现:
#include <stdio.h>
/*阶乘*/
long int factorial(int a){
long int p=1;
for(int i = 1;i <= a;i++){
p *= i;
}
return p;
}
/*组合C(n,m),n为下标,m为上标*/
int Cn(int n,int m){
return m==1?1:factorial(n-1)/(factorial(m-1)*factorial(n-m));
}
/*杨辉三角*/
int main(){
int n;
printf("输入行数(1~20):");
scanf("%d",&n);
for(int i = 1;i <= n;i++){
for(int j = 0;j < n-i;j++){
printf(" ");
}
for(int k = 0;k < i;k++){
printf("%6d",Cn(i,k+1));
}
putchar('\n');
}
return 0;
}
运行结果: