文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言如何实现动态开辟存储杨辉三角

2023-06-29 11:14

关注

本文小编为大家详细介绍“C语言如何实现动态开辟存储杨辉三角”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言如何实现动态开辟存储杨辉三角”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

问题引入

杨辉三角相必大家并不陌生,第1行有1列、第二行有2列…第n行有n列,且每行行首和行尾的值都为1,其余的值为上一行两数相加

C语言如何实现动态开辟存储杨辉三角

我们在C语言阶段,第一次碰到的杨辉三角应该都是用常规的二维数组存储,可以观察到,用绿色填充的空间都是没有被利用的。

存储1行                   浪费0个

存储2行                   浪费1个

存储3行                   浪费3个 

存储4行                   浪费6个

                .

                .

                .

存储n行               浪费n*(n+1)/2-n个

C语言如何实现动态开辟存储杨辉三角

解决方法

这样极大浪费空间资源,今天我们就来试试动态开辟存储杨辉三角,可以灵活的开辟空间,充分的利用空间。

思路分析

首先用指针pp维护动态开辟的int*类型的指针,再通过int*类型的指针去维护动态开辟的int型数据存储杨辉三角

C语言如何实现动态开辟存储杨辉三角

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++实现

用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个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;}

读到这里,这篇“C语言如何实现动态开辟存储杨辉三角”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯