C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)開(kāi)辟存儲(chǔ)楊輝三角
問(wèn)題引入
楊輝三角相必大家并不陌生,第1行有1列、第二行有2列…第n行有n列,且每行行首和行尾的值都為1,其余的值為上一行兩數(shù)相加

我們?cè)贑語(yǔ)言階段,第一次碰到的楊輝三角應(yīng)該都是用常規(guī)的二維數(shù)組存儲(chǔ),可以觀察到,用綠色填充的空間都是沒(méi)有被利用的。
存儲(chǔ)1行 浪費(fèi)0個(gè)
存儲(chǔ)2行 浪費(fèi)1個(gè)
存儲(chǔ)3行 浪費(fèi)3個(gè)
存儲(chǔ)4行 浪費(fèi)6個(gè)
.
.
.
存儲(chǔ)n行 浪費(fèi)n*(n+1)/2-n個(gè)

解決方法
這樣極大浪費(fèi)空間資源,今天我們就來(lái)試試動(dòng)態(tài)開(kāi)辟存儲(chǔ)楊輝三角,可以靈活的開(kāi)辟空間,充分的利用空間。
思路分析
首先用指針pp維護(hù)動(dòng)態(tài)開(kāi)辟的int*類型的指針,再通過(guò)int*類型的指針去維護(hù)動(dòng)態(tài)開(kāi)辟的int型數(shù)據(jù)存儲(chǔ)楊輝三角

C代碼實(shí)現(xiàn)
#include <stdio.h>
#include <stdlib.h>
void PrintFree(int** pp, int numrows)
{
//打印
for (int i = 0; i < numrows; i++)
{
for (int k = 0; k < numrows - i; k++)
{
printf(" ");
}
for (int j = 0; j <= i; j++)
{
printf("%4d", pp[i][j]); //可以根據(jù)打印的行數(shù)適當(dāng)調(diào)整右對(duì)齊
printf(" ");
}
printf("\n");
}
}
//清理malloc出來(lái)的空間
for (int i = 0; i < numrows; i++)
{
free(pp[i]);
pp[i] = NULL;
}
}
int main()
{
//楊輝三角的行數(shù)
int numrows;
scanf("%d", &numrows);
//開(kāi)辟numrows個(gè)int*類型的指針用來(lái)維護(hù)int型的數(shù)據(jù)
int** pp = (int**)malloc(sizeof(int*) * numrows);
for (int i = 0; i < numrows; i++)
{
//int型數(shù)據(jù)個(gè)數(shù)隨著行數(shù)的增加而增加
pp[i] = (int*)malloc(sizeof(int) * (i + 1));
}
for (int i = 0; i < numrows; i++)
{
for (int j = 0; j <= i; j++)
{
//每行的行首和行尾都是1
if (j == 0 || i == j)
{
pp[i][j] = 1; // 等價(jià)于 *(*(pp+i)+j)
}
//其余的就是上一行的兩個(gè)數(shù)據(jù)相加
else
{
pp[i][j] = pp[i - 1][j - 1] + pp[i - 1][j];
}
}
}
PrintFree(pp, numrows);
return 0;
}
大家可以根據(jù)需要打印的行數(shù)大小在上面的打印函數(shù)適當(dāng)調(diào)整

C++實(shí)現(xiàn)
用C++就非常方便了,STL中的vector就可以很方便的解決
#include <iostream>
#include <vector>
using namespace std;
//打印函數(shù)
void Print(vector<vector<int>> vv, int numrows)
{
for (int i = 0; i < numrows; i++)
{
for (int j = 0; j <= i; j++)
{
cout << vv[i][j] << " ";
}
cout << endl;
}
}
int main()
{
int numrows;
cin >> numrows;
vector<vector<int>> vv;
for (int i = 0; i < numrows; i++)
{
//每次開(kāi)i+1個(gè)vector<int>
vv.resize(i + 1);
//每次開(kāi)i+1個(gè)int
vv[i].resize(i + 1);
}
for (int i = 0; i < numrows; i++)
{
for (int j = 0; j <= i; j++)
{
if (j == 0 || i == j)
{
vv[i][j] = 1;
}
else
{
vv[i][j] = vv[i - 1][j - 1] + vv[i - 1][j];
}
}
}
Print(vv, numrows);
return 0;
}
以上就是通過(guò)動(dòng)態(tài)開(kāi)辟的楊輝三角了
到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)開(kāi)辟存儲(chǔ)楊輝三角的文章就介紹到這了,更多相關(guān)C語(yǔ)言楊輝三角內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合詳解
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
c語(yǔ)言實(shí)現(xiàn)24小時(shí)制轉(zhuǎn)換為12小時(shí)制示例
這篇文章主要介紹了c語(yǔ)言實(shí)現(xiàn)24小時(shí)制轉(zhuǎn)換為12小時(shí)制示例,需要的朋友可以參考下2014-04-04
使用C語(yǔ)言實(shí)現(xiàn)交換整數(shù)的奇數(shù)位和偶數(shù)位
在C語(yǔ)言中,要交換一個(gè)整數(shù)的二進(jìn)制位中的奇數(shù)位和偶數(shù)位,重點(diǎn)需要理解位操作,當(dāng)我們談?wù)摱M(jìn)制位的奇數(shù)位和偶數(shù)位時(shí),我們是指從右到左數(shù)的位置,本文給大家介紹了使用C語(yǔ)言代碼實(shí)現(xiàn)將一個(gè)整數(shù)的奇數(shù)位和偶數(shù)位交換,需要的朋友可以參考下2025-03-03
C語(yǔ)言實(shí)現(xiàn)線索二叉樹(shù)的定義與遍歷示例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)線索二叉樹(shù)的定義與遍歷,結(jié)合具體實(shí)例形式分析了基于C語(yǔ)言的線索二叉樹(shù)定義及遍歷操作相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2017-06-06
Qt GUI圖形圖像開(kāi)發(fā)之Qt表格控件QTableView簡(jiǎn)單使用方法及QTableView與QTableWidget區(qū)
這篇文章主要介紹了Qt GUI圖形圖像開(kāi)發(fā)之Qt表格控件QTableView簡(jiǎn)單使用方法,需要的朋友可以參考下2020-03-03
老生常談C語(yǔ)言靜態(tài)函數(shù)庫(kù)的制作和使用
下面小編就為大家?guī)?lái)一篇老生常談C語(yǔ)言靜態(tài)函數(shù)庫(kù)的制作和使用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
C++實(shí)現(xiàn)十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的數(shù)學(xué)算法
這篇文章和大家分享一下我個(gè)人對(duì)十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的想法,目前暫時(shí)更新只整數(shù)十進(jìn)制的轉(zhuǎn)換,后續(xù)會(huì)更新帶有小數(shù)的進(jìn)制轉(zhuǎn)換,代碼使用c++實(shí)現(xiàn)2021-09-09

