C語言實現動態開辟存儲楊輝三角

 更新時間:2022年03月10日 14:52:25   作者:寄一片海給你  
這篇文章主要介紹了如何利用C語言實現動態開辟存儲楊輝三角,可以靈活的開辟空間,充分的利用空間。文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下

問題引入

楊輝三角相必大家并不陌生,第1行有1列、第二行有2列…第n行有n列,且每行行首和行尾的值都為1,其余的值為上一行兩數相加

我們在C語言階段,第一次碰到的楊輝三角應該都是用常規的二維數組存儲,可以觀察到,用綠色填充的空間都是沒有被利用的。

存儲1行                   浪費0個

存儲2行                   浪費1個

存儲3行                   浪費3個 

存儲4行                   浪費6個

                .

                .

                .

存儲n行               浪費n*(n+1)/2-n個

解決方法

這樣極大浪費空間資源,今天我們就來試試動態開辟存儲楊輝三角,可以靈活的開辟空間,充分的利用空間。

思路分析

首先用指針pp維護動態開辟的int*類型的指針,再通過int*類型的指針去維護動態開辟的int型數據存儲楊輝三角

C代碼實現

#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]);	//可以根據打印的行數適當調整右對齊
			printf("   ");
		}
		printf("\n");
	}
}
	//清理malloc出來的空間
	for (int i = 0; i < numrows; i++)
	{
		free(pp[i]);
		pp[i] = NULL;
	}
}

int main()
{	
	//楊輝三角的行數
	int numrows;
	scanf("%d", &numrows);
	//開辟numrows個int*類型的指針用來維護int型的數據
	int** pp = (int**)malloc(sizeof(int*) * numrows);
	for (int i = 0; i < numrows; i++)
	{	
		//int型數據個數隨著行數的增加而增加
		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)
			}
			//其余的就是上一行的兩個數據相加
			else
			{
				pp[i][j] = pp[i - 1][j - 1] + pp[i - 1][j];
			}
		}
	}
	PrintFree(pp, numrows);

	return 0;
}

大家可以根據需要打印的行數大小在上面的打印函數適當調整

C++實現

用C++就非常方便了,STL中的vector就可以很方便的解決

#include <iostream>
#include <vector>
using namespace std;

//打印函數
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;

}

以上就是通過動態開辟的楊輝三角了

到此這篇關于C語言實現動態開辟存儲楊輝三角的文章就介紹到這了,更多相關C語言楊輝三角內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 數據結構 雙機調度問題的實例詳解

    數據結構 雙機調度問題的實例詳解

    這篇文章主要介紹了數據結構 雙機調度問題的實例詳解的相關資料,雙機調度問題,又稱獨立任務最優調度:用兩臺處理機A和B處理n個作業的實例,需要的朋友可以參考下
    2017-08-08
  • 在C++中自定義宏的簡單方法

    在C++中自定義宏的簡單方法

    這篇文章主要介紹了在C++中自定義宏的簡單方法,作者建議使用類似定義函數一樣的方法來定義宏,需要的朋友可以參考下
    2015-07-07
  • C++ stack與queue模擬實現詳解

    C++ stack與queue模擬實現詳解

    這篇文章主要給大家介紹了關于c++stack與queue模擬實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧
    2021-08-08
  • 詳解如何配置CLion作為Qt5開發環境的方法

    詳解如何配置CLion作為Qt5開發環境的方法

    這篇文章主要介紹了詳解如何配置CLion作為Qt5開發環境的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • C語言實現簡易三子棋游戲

    C語言實現簡易三子棋游戲

    這篇文章主要為大家詳細介紹了C語言實現簡易三子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C++中BitBlt的使用方法詳解

    C++中BitBlt的使用方法詳解

    這篇文章主要介紹了C++中BitBlt的使用方法詳解的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Cocos2d-x保存用戶游戲數據之XML文件是否存在問題判斷方法

    Cocos2d-x保存用戶游戲數據之XML文件是否存在問題判斷方法

    這篇文章主要介紹了Cocos2d-x保存用戶游戲數據之XML文件是否存在問題判斷方法,請注意代碼中包含大量注釋,需要的朋友可以參考下
    2014-09-09
  • C/C++實現字符串模糊匹配

    C/C++實現字符串模糊匹配

    本文分別給大家介紹了2個C++在Linux平臺和windows平臺下實現字符串模糊匹配的方法,基本的核心思想都是一樣的,均是使用fnmatch函數,有需要的小伙伴可以參考下。
    2016-04-04
  • C++實現LeetCode(131.拆分回文串)

    C++實現LeetCode(131.拆分回文串)

    這篇文章主要介紹了C++實現LeetCode(131.拆分回文串),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • c語言判斷是否素數程序代碼

    c語言判斷是否素數程序代碼

    這篇文章主要介紹了c語言判斷是否素數的方法和問題,大家參考使用吧
    2013-11-11

最新評論

免费人成视频在线观看