题目:
输入n,输出杨辉三角形的前n行。杨辉三角形如下:11 11 2 11 3 3 11 4 6 4 1…每行第一列和最后一列元素均为1其他列元素为其所在位置的上一行对应列和上一行前一列元素之和
一个漂亮的杨辉三角
步骤一:首先呢,我喜欢先把大体模样输出来,先实现输入行数n,然后输出一个由n行字符构成的三角形,如下:
大体框架
先不管这个三角形和杨辉三角长得是否一样,总之利用两个for循环输出类似的图形,是考试必会的,我们之后美化一下图形。
步骤二:好嘞,接下来该分析一下杨辉三角的特征了:
规律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];
}
另外一种方法,不知道大家有没有注意到:
规律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;
}
得到一个歪歪扭扭的三角形
步骤三:接下来先不忙着调整上面这个扭曲的三角形,我们仔细看一下发现第一行输出了两个1,这是什么情况呢。
原因
那么我们可以加一个判断:
如果是第一行,就直接输出一个1就好额,其他的行就按规律行事。
注意看if-else语句
步骤四:现在可以来调整三角形的样子啦。
排版嘛,就是空格的多少,百位数的就是一个空格,十位数的就是两个空格,至于是一位数的话,就是一个空格。
最后暴力解决,长这样!
完整代码如下:
#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;
}
当然啦,上述代码只是求解杨辉三角形中最简单最基础的两种。
学渣表示伤不起哇。
欢迎大家提供其他的解决思路~~
,