制作网站常用软件,线上编程课推荐哪一个,设计一个公司网站多少钱,立水桥大型网站建设点击蓝字关注我们问题引入杨辉三角相必大家并不陌生#xff0c;第1行有1列、第二行有2列…第n行有n列#xff0c;且每行行首和行尾的值都为1#xff0c;其余的值为上一行两数相加我们在C语言阶段#xff0c;第一次碰到的杨辉三角应该都是用常规的二维数组存储#xff0c;可…点击蓝字关注我们问题引入杨辉三角相必大家并不陌生第1行有1列、第二行有2列…第n行有n列且每行行首和行尾的值都为1其余的值为上一行两数相加我们在C语言阶段第一次碰到的杨辉三角应该都是用常规的二维数组存储可以观察到用绿色填充的空间都是没有被利用的。 存储1行 浪费0个 存储2行 浪费1个 存储3行 浪费3个 存储4行 浪费6个 . . . 存储n行 浪费n*(n1)/2-n个解决方法这样极大浪费空间资源今天我们就来试试动态开辟存储杨辉三角可以灵活的开辟空间充分的利用空间。思路分析首先用指针pp维护动态开辟的int*类型的指针再通过int*类型的指针去维护动态开辟的int型数据存储杨辉三角C语言代码实现#include stdio.h
#include stdlib.hvoid 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; // 等价于 *(*(ppi)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(vectorvectorint 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;vectorvectorint vv;//先开numrows个vectorintvv.resize(numrows);for (int i 0; i numrows; i){ //对第i个vectorint,每次开i1个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个名额▲扫描二维码-免费领取戳“阅读原文”我们一起进步