欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)開(kāi)辟存儲(chǔ)楊輝三角

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

問(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)文章

最新評(píng)論