题目:

输入n,输出杨辉三角形的前n行。杨辉三角形如下:11 11 2 11 3 3 11 4 6 4 1…每行第一列和最后一列元素均为1其他列元素为其所在位置的上一行对应列和上一行前一列元素之和

如何用c语言输出杨辉三角(C语言经典算法输出杨辉三角)(1)

一个漂亮的杨辉三角

步骤一:首先呢,我喜欢先把大体模样输出来,先实现输入行数n,然后输出一个由n行字符构成的三角形,如下:

如何用c语言输出杨辉三角(C语言经典算法输出杨辉三角)(2)

大体框架

先不管这个三角形和杨辉三角长得是否一样,总之利用两个for循环输出类似的图形,是考试必会的,我们之后美化一下图形。

步骤二:好嘞,接下来该分析一下杨辉三角的特征了:

如何用c语言输出杨辉三角(C语言经典算法输出杨辉三角)(3)

规律1

将上图杨辉三角按行从第1行开始,列从第0列开始,那么图中被圈出来的10和5都是第六行的。

不难得出结论:10=上一行的4 6,5=上一行的4 1。利用这个规律,可以构建二维数组a[][],从而有:

a[i][j]=a[i-1][j-1] a[i-1][j];/*每个数是上面两数之和*/

//下面是利用上述方法的关键代码

void yanghui(int a[][N])

{

int j, k;

for (j = 0; j<N; j )

{

a[j][0] = 1;

a[j][j] = 1;

}

for (j = 2; j<N; j )

for (k = 1; k<j; k )

a[j][k] = a[j - 1][k - 1] a[j - 1][k];

}

另外一种方法,不知道大家有没有注意到:

如何用c语言输出杨辉三角(C语言经典算法输出杨辉三角)(4)

规律2

也就是:位于第i行j列的数=(i-j)*前面一个数/j。

即(行数-列数)*前面一个数/列数

好啦,根据这个思想,编写代码如下:

int main()

{

int n;

cout << "请输入行数:" << endl;

cin >> n;

int upNumber = 1;//用来记录上一个数

for (int i = 1; i <= n; i )

{

upNumber = 1;

//输出三角空格

for (int j = n; j>i; j--)//这是为了使三角形成为正三角形

{

cout << " ";

}

cout << "1";// 这是输出每一行的第一个1

for (int j = 1; j <= i - 2; j )

{

upNumber = (i - j) * upNumber / j;

cout << upNumber<<" ";

}

cout << "1" << endl;// 每一行的最后一个 1

}

return 0;

}

如何用c语言输出杨辉三角(C语言经典算法输出杨辉三角)(5)

得到一个歪歪扭扭的三角形

步骤三:接下来先不忙着调整上面这个扭曲的三角形,我们仔细看一下发现第一行输出了两个1,这是什么情况呢。

如何用c语言输出杨辉三角(C语言经典算法输出杨辉三角)(6)

原因

那么我们可以加一个判断:

如果是第一行,就直接输出一个1就好额,其他的行就按规律行事。

如何用c语言输出杨辉三角(C语言经典算法输出杨辉三角)(7)

注意看if-else语句

步骤四:现在可以来调整三角形的样子啦。

排版嘛,就是空格的多少,百位数的就是一个空格,十位数的就是两个空格,至于是一位数的话,就是一个空格。

最后暴力解决,长这样!

如何用c语言输出杨辉三角(C语言经典算法输出杨辉三角)(8)

完整代码如下:

#include <stdio.h>

#include<iostream>

using namespace std;

int main()

{

int n = 0;

cout << "请输入行数:" << endl;

cin >> n;

int upNumber = 1;//用来记录上一个数

int count = 1; //排序时用来记录数字的长度

int sum = 0;//排序时用来计算的变量

for (int i = 1; i <= n; i )

{

upNumber = 1;

//输出三角空格

for (int j = n; j>i; j--)//这是为了使三角形成为正三角形

{

cout << " ";

}

if (i == 1) { cout << "1"<<endl; }

else{

cout << "1"<<" " ;// 这是输出每一行的第一个1

for (int j = 1; j <= i - 2; j )

{

upNumber = (i - j) * upNumber / j;

sum = upNumber;

while (sum>=10)

{

sum /= 10;

count ;

}

if (count == 3) {

cout << upNumber << " ";

count = 1;

}

else if (count == 2) {

cout << upNumber << " ";

count = 1;

}

else {

cout << upNumber << " ";

count = 1;

}

}

cout << "1" << endl;// 每一行的最后一个 1

}

}

return 0;

}

当然啦,上述代码只是求解杨辉三角形中最简单最基础的两种。

学渣表示伤不起哇。

欢迎大家提供其他的解决思路~~

,