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代码
下一篇:C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解
本文标题:C语言实现动态开辟存储杨辉三角
本文地址:http://www.codeinn.net/misctech/222016.html