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++在非面向?qū)ο蠓矫鎸?duì)C語(yǔ)言的擴(kuò)充
C++是一種面向?qū)ο缶幊陶Z(yǔ)言,但它也可以作為C語(yǔ)言的擴(kuò)展語(yǔ)言。在C++中,我們可以使用非面向?qū)ο蠓矫娴奶匦詠?lái)擴(kuò)展C語(yǔ)言。在本文中,我們將討論C++在非面向?qū)ο蠓矫鎸?duì)C語(yǔ)言的擴(kuò)充2023-05-05C語(yǔ)言新建臨時(shí)文件和臨時(shí)文件名的方法
這篇文章主要介紹了C語(yǔ)言新建臨時(shí)文件和臨時(shí)文件名的方法,分別是mkstemp()函數(shù)和mktemp()函數(shù)的使用,需要的朋友可以參考下2015-08-08C語(yǔ)言中邏輯運(yùn)算符與條件運(yùn)算符的學(xué)習(xí)教程
這篇文章主要介紹了C語(yǔ)言中邏輯運(yùn)算符與條件運(yùn)算符的學(xué)習(xí)教程,條件運(yùn)算符問(wèn)號(hào)即三目運(yùn)算符使用起來(lái)十分方便,需要的朋友可以參考下2016-04-04C語(yǔ)言for循環(huán)嵌套for循環(huán)在實(shí)踐題目中應(yīng)用詳解
初學(xué)C語(yǔ)言,常常遇到for循環(huán)中嵌套個(gè)for循環(huán),初學(xué)者對(duì)于這種形式總是一知半解,這次我就整理了常見(jiàn)的for循環(huán)嵌套for循環(huán)的題目,我們一起爭(zhēng)取一舉拿下這類題。學(xué)廢他們,以后再見(jiàn)到就不怕啦!每天都要學(xué)一點(diǎn)呀。加油,奮斗的我們2022-05-05C++實(shí)現(xiàn)LeetCode(104.二叉樹(shù)的最大深度)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(104.二叉樹(shù)的最大深度),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++11中std::move、std::forward、左右值引用、移動(dòng)構(gòu)造函數(shù)的測(cè)試問(wèn)題
這篇文章主要介紹了C++11中std::move、std::forward、左右值引用、移動(dòng)構(gòu)造函數(shù)的測(cè)試,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09C++實(shí)現(xiàn)LeetCode(109.將有序鏈表轉(zhuǎn)為二叉搜索樹(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(109.將有序鏈表轉(zhuǎn)為二叉搜索樹(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++返回值是類名和返回值是引用的區(qū)別及說(shuō)明
這篇文章主要介紹了C++返回值是類名和返回值是引用的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11C語(yǔ)言模擬實(shí)現(xiàn)庫(kù)函數(shù)詳解
C語(yǔ)言庫(kù)函數(shù)是把自定義函數(shù)放到庫(kù)里,是別人把一些常用到的函數(shù)編完放到一個(gè)文件里,供程序員使用,下面讓我們一起來(lái)詳細(xì)了解它2022-07-07