杨辉三角科普:
杨辉三角,是二项式系数在三角形中的一种几何排列。每个数等于它上方两数之和。如图:
C语言打印杨辉三角的方法
解法一
#include
int main()
{
int i, j, n = 0;
//首先定义二维数组计数符号i,j 还有杨辉三角行数的初始化
int a[100][100] = { 0 };
//二维数组大小可自定,但切记不可使其超过整形数组的大小
while (n < 1 || n >100)
//在输入的值不正确时自动初始化问题,重新输入
{
printf("请输入要打印的杨辉三角行数>:");
scanf("%d", &n);
}
for (i = 0; i < n; i++)
a[i][0] = 1;
//每一行第一个为1,用第一个for循环的输入
for (i = 1; i < n; i++)//第一层循环i决定第几行
for (j = 1; j <= i; j++)//第二层循环借用i限制每行字符数目
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
for (i = 0; i < n; i++)//一个for循环逐行打印叫a的二维数组
{
for (j = 0; j <= i; j++)
printf("%5d", a[i][j]);
printf("\n");
}
return 0;
}
解法二
#include
int main()
{
int i, j, n = 0;
//首先定义二维数组计数符号i,j 还有杨辉三角行数的初始化
int a[100][100] = { 1 };
//二维数组大小可自定,但切记不可使其超过整形数组的大小
while (n < 1 || n >100)
//在输入的值不正确时自动初始化问题,重新输入
{
printf("请输入要打印的杨辉三角行数>:");
scanf("%d", &n);
}
for (i = 1; i < n; i++)//第一层循环i决定第几行
{
a[i][0] = 1;
for (j = 1; j <= i; j++)//第二层循环借用i限制每行字符数目
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
for (i = 0; i < n; i++)//一个for循环逐行打印叫a的二维数组
{
for (j = 0; j <= i; j++)
printf("%5d", a[i][j]);
printf("\n");
}
return 0;
}
//把每一行的第一个初始化1的操作包入第一个for循环中,并且改动二维数组初始化值为1
解法三
#include
int main()
{
int i, j, n = 0;
//首先定义二维数组计数符号i,j 还有杨辉三角行数的初始化
int a[100][100] = { 0,1 };
//只有2个初值,即a[0][0]=1,a[0][1]=2,其余数组元素的初值均为0
//二维数组大小可自定,但切记不可使其超过整形数组的大小
while (n < 1 || n >100)
//在输入的值不正确时自动初始化问题,重新输入
{
printf("请输入要打印的杨辉三角行数>:");
scanf("%d", &n);
}
for (i = 1; i < n; i++)//第一层循环i决定第几行
for (j = 1; j <= i; j++)//第二层循环借用i限制每行字符数目
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
for (i = 1; i < n; i++)//一个for循环逐行打印叫a的二维数组
{
for (j = 1; j <= i; j++)
printf("%5d", a[i][j]);
printf("\n");
}
return 0;
}
//优化于方法一二,取消二维数组中第一列赋值为1的做法,且在最后输出时略有改动
解法四
#include
int main()
{
int i, j, n = 0;
//首先定义二维数组计数符号i,j 还有杨辉三角行数的初始化
int a[100][100] = { 0,1 };
//二维数组大小可自定,但切记不可使其超过整形数组的大小
while (n < 1 || n >100)
//在输入的值不正确时自动初始化问题,重新输入
{
printf("请输入要打印的杨辉三角行数>:");
scanf("%d", &n);
}
for (i = 1; i < n; i++)//第一层循环i决定第几行
{
for (j = 1; j <= i; j++)//第二层循环借用i限制每行字符数目
{
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
printf("%5d", a[i][j]);
}
printf("\n");
}
return 0;
}
//优化于解法三,仅将赋值输出同时进行,且注意换行符的位置更替。
解法五
#include
int main()
{
int i, j, n = 0;
//首先定义二维数组计数符号i,j 还有杨辉三角行数的初始化
int a[100] = { 1 };
int b[100] = { 0 };
while (n < 1 || n >100)
//在输入的值不正确时自动初始化问题,重新输入
{
printf("请输入要打印的杨辉三角行数>:");
scanf("%d", &n);
}
for (i = 0; i < n; i++)
{
b[0] = a[0];
for (j = 1; j <= i; j++)
b[j] = a[j - 1] + a[j];
for (j = 0; j <= i; j++)
{
a[j] = b[j];
printf("%5d", a[j]);
}
printf("\n");
}
return 0;
}
//解法五不同于前者,使用两个一维数组能够较好的节省空间,方法可行,but运行方式有待我仔细酌定。
解法六
#include
int main()
{
int i, j, n = 0;
int l, r;
//首先定义二维数组计数符号i,j 还有杨辉三角行数的初始化
int a[100] = { 0,1 };
while (n < 1 || n >100)
//在输入的值不正确时自动初始化问题,重新输入
{
printf("请输入要打印的杨辉三角行数>:");
scanf("%d", &n);
}
for (i = 1; i < n; i++)
{
l = 0;
for (j = 1; j <= i; j++)
{
r = a[j];
a[j] = l + r;
l = r;
printf("%5d", a[j]);
}
printf("\n");
}
return 0;
}
//解法六使用一个一维数组,再加两个临时变量进行操作
解法七:使用一维数组,占用内存少
#include
int main()
{
int i, j, n, k, t;
long Buf[21]={0,1}; //用于保存一行数据
printf("请输入杨辉三角形的行数(1 ~ 20):");
scanf("%d",&n);
for( i = 1; i <= n; i++) //输出n行
{
for( j = 0; j < n - i; j++) //每行前面补空格,形成等腰三角图案
printf(" ");
t = 0;
for( j = 1; j <= i; j++)//计算并输出杨辉三角形
{
k = Buf[j];
Buf[j] = t + k; //每个数是上面两数之和(三角计算)
t = k;
printf("%6d", Buf[j]);
}
printf("\n");
}
return 0;
}
解法八:使用递归函数法,程序最简,占用内存最少,最佳算法
#include
long Tri(int r, int c) //杨辉三角算法函数
{
return (c == 1 || c == r) ? 1 : Tri( r - 1, c - 1 ) + Tri( r - 1, c );
}
int main()
{
int i, j, n;
printf("请输入杨辉三角形的行数(1 ~ 20):");
scanf("%d", &n);
for( i = 1; i <= n; i++) // 输出n行
{
for( j = 0; j < n - i; j++) //每行前面补空格,显示成等腰三角形
printf(" ");
for( j = 1; j <= i; j++)
printf("%6d", Tri(i, j)); //计算并输出杨辉三角形
printf("\n");
}
return 0;
}
解法九(来源于百度百科,特此整理记录)
#include
#include
using namespace std;
int main()
{
const int n = 15;
const int m = 2 * n-1;
int arr[n + 1][m] = { 0 };
for (int i = 0; i < n; i++)
{
arr[i][n - i- 1] = 1;
arr[i][n + i -1] = 1;
}
for (int i = 2; i < n; i++)
for (int j = n - i + 1; j < n-2+i; j = j + 2)
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j + 1];
int p;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n - i - 1; j++)
cout << " ";
p = 1;
for (int j = n - i - 1; p < i + 2; j = j + 2)
{
cout << setw(4) << arr[i][j] << " ";
p = p + 1;
}
cout << endl;
}
return 0;
}
例题HDOJ 2032 杨辉三角
解析HDOJ 2032 杨辉三角解析