C語言實現(xiàn)動態(tài)開辟存儲楊輝三角
問題引入
楊輝三角相必大家并不陌生,第1行有1列、第二行有2列…第n行有n列,且每行行首和行尾的值都為1,其余的值為上一行兩數(shù)相加
我們在C語言階段,第一次碰到的楊輝三角應(yīng)該都是用常規(guī)的二維數(shù)組存儲,可以觀察到,用綠色填充的空間都是沒有被利用的。
存儲1行 浪費0個
存儲2行 浪費1個
存儲3行 浪費3個
存儲4行 浪費6個
.
.
.
存儲n行 浪費n*(n+1)/2-n個
解決方法
這樣極大浪費空間資源,今天我們就來試試動態(tài)開辟存儲楊輝三角,可以靈活的開辟空間,充分的利用空間。
思路分析
首先用指針pp維護動態(tài)開辟的int*類型的指針,再通過int*類型的指針去維護動態(tài)開辟的int型數(shù)據(jù)存儲楊輝三角
C代碼實現(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)整右對齊 printf(" "); } printf("\n"); } } //清理malloc出來的空間 for (int i = 0; i < numrows; i++) { free(pp[i]); pp[i] = NULL; } } int main() { //楊輝三角的行數(shù) int numrows; scanf("%d", &numrows); //開辟numrows個int*類型的指針用來維護int型的數(shù)據(jù) int** pp = (int**)malloc(sizeof(int*) * numrows); for (int i = 0; i < numrows; i++) { //int型數(shù)據(jù)個數(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; // 等價于 *(*(pp+i)+j) } //其余的就是上一行的兩個數(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++實現(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++) { //每次開i+1個vector<int> vv.resize(i + 1); //每次開i+1個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; }
以上就是通過動態(tài)開辟的楊輝三角了
到此這篇關(guān)于C語言實現(xiàn)動態(tài)開辟存儲楊輝三角的文章就介紹到這了,更多相關(guān)C語言楊輝三角內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言for循環(huán)嵌套for循環(huán)在實踐題目中應(yīng)用詳解
初學(xué)C語言,常常遇到for循環(huán)中嵌套個for循環(huán),初學(xué)者對于這種形式總是一知半解,這次我就整理了常見的for循環(huán)嵌套for循環(huán)的題目,我們一起爭取一舉拿下這類題。學(xué)廢他們,以后再見到就不怕啦!每天都要學(xué)一點呀。加油,奮斗的我們2022-05-05C++實現(xiàn)LeetCode(104.二叉樹的最大深度)
這篇文章主要介紹了C++實現(xiàn)LeetCode(104.二叉樹的最大深度),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++11中std::move、std::forward、左右值引用、移動構(gòu)造函數(shù)的測試問題
這篇文章主要介紹了C++11中std::move、std::forward、左右值引用、移動構(gòu)造函數(shù)的測試,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09C++實現(xiàn)LeetCode(109.將有序鏈表轉(zhuǎn)為二叉搜索樹)
這篇文章主要介紹了C++實現(xiàn)LeetCode(109.將有序鏈表轉(zhuǎn)為二叉搜索樹),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07