点击蓝字
关注我们
问题引入
杨辉三角相必大家并不陌生,第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++){ //每行的行首和行尾都是1if (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;//先开numrows个vector<int>vv.resize(numrows);for (int i = 0; i < numrows; i++){ //对第i个vector<int>,每次开i+1个intvv[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;}
如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取
戳“阅读原文”我们一起进步