一、使用二维数组实现
#include <stdio.h>
//释放堆区空间
void freespace(int* arr[], int size)
{
if(arr == NULL)
return;
for(int i = 0; i < size; i++)
{
free(arr[i]);
arr[i] = NULL;
}
}
//杨辉三角
void yang(int*arr[], int rows)
{
if(arr == NULL) return;
for(int i = 0; i < rows; i++)
{
arr[i] = (int*)malloc(sizeof(int) * rows);
if(arr[i] == NULL)
return;
}
if(arr == NULL)
return;
for(int i = 0; i < rows; i++)
{
for(int j = 0; j <= i; j++)
{
if(j == 0 || i == j)
{
*(arr[i] + j) = 1;
}
else
{
*(arr[i] + j) = *(arr[i - 1] + j - 1) + *(arr[i - 1] + j);
}
printf("%4d", *(arr[i] + j));
}
printf("\n");
}
}
int main()
{
int* arr[10] = {
0};
yang(arr, 5);
freespace(arr, 5);
}
结果:输出5行
二、使用一维数组实现输出n行的杨辉三角
思想:i控制行数,j是元素下标,从尾向前扫
#include <stdio.h>
#include <malloc.h>
int main()
{
int rows;
scanf("%d", &rows);
int* arr = (int*)malloc(sizeof(int) * rows);
if(arr == NULL)
return;
arr[0] = 1;
for(int i = 0; i < rows; i++)
{
for(int j = i; j >= 0; j--)
{
if(j == 0 || i == j)
{
arr[j] = 1;
}
else
{
arr[j] = arr[j ]+ arr[j - 1];
}
printf("%4d", arr[j]);
}
printf("\n");
}
free(arr);
arr = NULL;
}
结果:输出5行
三、不使用数组打印杨辉三角
思路: i控制行 j 控制下标
**规律:**除了j == 0 和 i == j情况下,其余每一个数的对应的i > j,并且当前位置的数满足下面式子
val = val * (i - j + 1) / j ;
代码如下:
#include <stdio.h>
int main()
{
int rows = 5;
int val = 1;
for(int i = 0; i < rows; i++)
{
for(int j = 0; j <= i; j++)
{
if(j == 0 || i == j)
{
val = 1;
}
else
{
val = val * (i - j + 1) / j;
}
printf("%4d", val);
}
printf("\n");
}
}
结果: