題目:
輸入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;
}
當然啦,上述代碼隻是求解楊輝三角形中最簡單最基礎的兩種。
學渣表示傷不起哇。
歡迎大家提供其他的解決思路~~
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!