自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 【C++入门】内存管理

6)申请自定义类型时,malloc和free只会开辟和释放空间,不会调用构造函数与析构函数,而new在申请空间时会调用构造函数完成对象的初始化,delete在释放空间前,会调用析构函数完成对象中资源的清理。3)malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,如果是多个对象,在[ ]中指定即可。用户可使用系统接口创建共享共享内存,做进程间通信。2)new和delete申请和释放的是单个元素的空间,new[ ]和delete[ ]申请和释放的是连续的多个元素空间。

2024-04-22 00:00:35 624

原创 【C++入门】类的6个默认成员函数、运算符重载、初始化列表、const成员、static成员

在对象实例化时通过上述的构造函数后,类的成员变量有了一个初值,但这并不是初始化,严格来说,应该是赋值,因为在函数体内,可以给同一变量多次赋值,但每一个变量的初始化只有一次,所以,在函数体内给值根本不叫初始化。上面我们说过,初始化列表是用来给成员变量初始化的,具体的说,是用来给实例化出的对象中的变量初始化的,而静态成员为所有类对象共享,不属于某个具体对象,所以它不是在初始化列表初始化的。不可以,const对象中的成员是不可以修改的,而非const对象中的成员是可以修改的,这是典型的。

2024-04-20 13:00:47 1024

原创 【C++入门】类和对象

类的定义格式:class 类名/ /类体:由成员函数和成员变量组成/ / ……/ /分号不能少class为定义类的关键字。类体中的内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或成员函数。如果成员函数在类中声明和定义,那么编译器可能会把它当做内联函数处理。

2024-04-02 00:23:23 1028

原创 【C++入门】输入输出、命名空间、缺省参数、函数重载、引用、内联函数、auto、基于范围的for循环

命名空间的定义需要用到关键字namespace,格式为:namespace 命名空间的名字/ /……命名空间中可以定义变量、函数、类等。

2024-03-31 21:33:20 889 2

原创 【数据结构取经之路】队列&循环队列

循环队列的实现一般定义两个指针,头指针front和尾指针rear,front和rear开始都赋为0,每插入一个元素,rear++,每删除一个元素,front++,这和顺序栈如出一辙。因为是用单链表实现队列,如果仅仅记录队头,那么在插入数据时必须得遍历一遍链表,找到队列的尾,才能链接上新的结点,这是一个不小的消耗,所以,除了对链表的结点封装成一个结构体(A)外,还可以再封装一个结构体(B),B结构体成员里包含结构体A。在销毁节点A前,需要先记录A的下一个结点,否则把A释放后,将找不到它的下一个节点。

2024-03-21 23:55:49 657

原创 【数据结构取经之路】栈

用数组实现的栈叫顺序栈,用链表实现的栈叫链式栈,本文讲解的是顺序栈。初始化操作一般有两种,第一种,在初始化时就给数组分配一定的空间,第二种,初始化时不给分配空间,第一次插入数据时才个数组分配空间。虽然简单,但请不要写成pst->a[pst->top--]. 后置--是有副作用的,也就是说会改变top的值,但这里不需要改变top的值。顺序栈的删除实际上就是数组最后一个元素的删除,不需要挪动数据,top--即可,这样即使数组中还存在该元素,但是已经访问不到了。top的值就是栈的大小,所以返回top即可。

2024-03-19 23:06:18 600

原创 【数据结构取经之路】希尔排序

而多组并排呢,是先对9和6进行插入排序得到6 9,接着对下一组(蓝色数组)的8和5进行插入排序,并不是一次性将蓝色数组排好序得到2 5 8,而是不同组之间交替的进行部分插入排序。相较于直接插入排序,当gap不等于1时,元素不是一步一步的挪动的,而是跳跃式的移动,从而使得在进行最后一趟增量gap = 1的插入排序时,数组已基本有序,只要少量移动和比较即可完成排序。希尔排序的分析是一个复杂的问题,因为它的时间是所取“增量”序列的函数,这涉及到一些数学上尚未解决的难题。间隔为gap的分为一组,总计gap组。

2024-03-16 00:32:37 707

原创 【数据结构取经之路】建堆&堆排序

​堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。​

2024-03-15 13:51:06 649

原创 【数据结构取经之路】快速排序的非递归实现

递归实现快速排序在一些场景下有栈溢出的风险,下面就谈谈如何用非递归的方法实现快速排序。

2024-03-13 23:03:42 339

原创 【数据结构取经之路】快速排序及其优化

快速排序由C. A. R. Hoare在1962年提出,快速排序是一种高效的排序算法,其核心思想是通过一次排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的数据要小,然后再按此方法对这两部分数据分别进行快速排序,以实现整个序列有序。下文将给出实现快排的三种方法:霍尔法、挖坑法、前后指针法。同时也会给出面对一些特殊场景做出的优化。

2024-03-13 16:14:46 812

原创 【数据结构取经之路】归并排序

归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

2024-03-11 11:00:30 929

原创 【数据结构取经之路】单链表

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。,数据域就是存储数据的存储单元,指针域就是连接每个结点的地址数据。​接着再来说说单链表的意义,也就是它的优势。单链表的优势是相对于和它同属于线性表的顺序表而言的。顺序表的特点是逻辑关系上相邻的两个元素在物理位置上(内存中的真实存储情况)也相邻 ,因此,可以通过下标的随机访问来取出任意元素。但也正因为顺序表物理空间上的连续,在作插入或删除操作时,需要移动大量元素。

2024-01-05 15:12:46 1021 1

原创 C语言中的结构体你知多少?

位段是通过结构体来实现的一种以位(bit位)为单位的数据存储结构,它可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。> 位段的成员必须是int、unsigned int、char等整形家族成员。> 位段的成员一般都是同一数据类型,例如都是int或char类型。> 位段的出现就是为了节省空间的。

2023-12-24 16:17:37 60 1

原创 C语言中的指针

指针是C语言中最基础、最重要的概念之一,它使得C语言成为一门强大的、高效的、灵活的编程语言。指针的存在使得C语言可以进行复杂的内存操作,能够更好地控制程序的行为,同时也能够实现高效的数据结构和算法。简而言之,存储地址的变量就是指针变量,我们平常所说的指针其实就指的是指针变量。概念很简单易懂,但还是可以深挖的。先说明一下,地址的大小只与机器本身有关,与指针的类型无关。也就是说,指针无高低贵贱之分,char 类型的指针和 int 类型的指针在同一机器下一样大,在32位机器下是4个字节,64位机器下是8个字节。

2023-12-23 12:53:35 56

原创 三种方法解决轮转数组问题

题目描述给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。

2023-12-11 16:29:17 200

原创 如何判断大小端字节序

字节序指多字节数据中各个字节在内存中的存储顺序,分为大端字节序和小端字节序两种。

2023-12-10 01:16:41 31

原创 C语言中的动态内存管理

调用free(p)函数会释放p指向的内存块,但是不会改变p本身,因为传给free函数的p只是一个变量,并不是传地址,形参与实参分别占用不同的空间,对形参的改变是不会影响实参p的。当然,总存在这样的可能性:找不到满足我们需要的足够大的内存块。> 数组p是在栈上开辟的,没有用到内存开辟函数malloc和calloc,不会涉及到堆区,在函数GetMemory调用结束后,数组p会被销毁,即使已经返回了数组的起始地址给str,但是str所指向的空间不再属于这个程序,使用str指向的空间就会导致非法访问,打印乱码。

2023-12-09 18:46:55 45 1

原创 详解杨辉三角

我们只需要在上述代码里头加上一个for循环即可。下面 我们来分析如何打印空格。进行到这,就差把空格补上了。下面将谈谈如何把空格补上。//定义两个宏,方便修改。

2023-11-21 22:49:07 33

原创 常规方法和曼哈顿距离法打印菱形

对于打印菱形,我们可以把菱形一分为二找规律,也就是说,分别对上半部分和下半部分分析,找到它们各自的规律。设行号为 i ,上半部分行数为line_up, 则星号*的数量 = 2 * i + 1,空格数 = line_up - 1 - i。距离——两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。4 - 1 - 0即line_down - 1 - i, 式子最后+1,1是指红色分割线上的星号。4 - 1 - 1为 line_down - 1 - i, i 此时为1。

2023-11-20 16:34:29 55

原创 利用循环与递归解决喝汽水问题

下面我们再继续输入几组数据 ,看看规律如何。5块钱--------9瓶7块钱--------13瓶20块钱------39瓶……推出:喝的汽水总数= 2 * monny - 1基于这个规律,我们可用更简单的代码来解决这个问题。int main()printf("请输入你有多少钱:");return 0;

2023-11-16 23:05:28 91

原创 C语言如何实现strcpy函数

char*strcpy(charconstcharstrSource以上摘自MSDN。在文档中我们可以了解到:> strcpy是一个字符串拷贝函数> 函数有两个参数,参数的类型为char*,第一个参数为目标空间的首地址,第二个参数为源字符串 的首地址> 函数的返回类型为 char*> 函数返回值为目标空间首地址(Each of these functions returns the destination string)> 源字符串必须以‘ \0 ’结束。

2023-11-08 17:17:53 106

原创 3种方法求一个整数的二进制中1的个数

十进制 n ,要判断 n 的个位(最后一位)是否等于m(m

2023-11-07 23:09:52 43

原创 应用递归拆解整数并将各个位数相加

我们的目的是让这3次调用中的sum相加,也就是说这3次函数调用中sum会互相影响以达到累加的效果,但该程序的执行结果并不符合我们的预期。原因是在3次递归调用中,函数创建的局部变量都是相互独立的,它们占用不同的空间,因此,互不影响,从而没有累加的效果。所谓全局变量,它是储存在静态区的,而且在工程内部任意地方都可以使用,因为在整个程序执行的过程中只创建一次sum,只开辟一次空间,所以就不存在上述案例中创建了多个地址不同的sum导致sum之间不能进行累加的问题。很明显,输出结构时错误的,正确的结果应该是6。

2023-11-05 11:12:27 121 1

原创 C语言求第n个斐波那契数(递归与迭代)

斐波那契数列:1 1 2 3 5 8 13 21 34 55 89......通过观察,我们不难发现,其规律为:从第三个数开始,前两个数的和等于后一个数。基于此规律,下面将给出用递归来求斐波那契数和非递归求斐波那契数的方法,并比较这两种方法的优缺点。首先讲讲递归的方法。

2023-11-03 23:49:07 234

原创 C语言求最小公倍数的3种方法

两个数的最小公倍数一定大于或等于这两个数中的较大值,根据这一规律,我们可以直接从这两个数中的较大数开始,依次加1,加1得到的结果拿来试除这两个数,直到能同时被这两个数整除。例如,求 2 和 3 的最小公倍数。3较大,引入一个变量num,num>=3,从num = 3开始,num % 2!= 0,所以num++,变为4, 4 % 3!= 0,继续执行num++,变为5, 5 % 2!= 0,num++,变为6, 6 % 2 = 0,6 % 3 = 0。所以2 和 3 的最小公倍数为6。

2023-11-02 20:25:28 8102 2

原创 C语言实现扫雷(附源码)

首先简单的讲讲扫雷的规则:每次点开一个格子,如果是雷,将会被炸死,游戏结束;如果不是雷,那么将统计该格子周围的雷的个数。

2023-11-02 18:24:24 71

原创 矩阵转置问题

输入描述:第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。输出描述:输出m行n列,为矩阵转置后的结果。每个数后面有一个空格。示例1输入:2 31 2 34 5 6复制输出:1 42 53 6问题分析。

2023-11-02 00:29:20 47

原创 合并两个有序数列

题目描述:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。数据范围: 1≤n,m≤1000 , 序列中的值满足 0≤val≤30000。输入描述:输入包含三行,第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。第二行包含n个整数,用空格分隔。第三行包含m个整数,用空格分隔。输出描述:输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。

2023-11-01 23:39:13 121 1

原创 巧解月份的天数

输入年份和月份,输出该月的天数。不难发现,只有在闰年的二月份才会特殊情况,因此我们需要单独处理这一特殊情况。下面我们利用【数组】来解决。

2023-10-28 18:00:31 39 1

原创 猜数字小游戏

在rand函数使用前需要调用srand函数设置随机数生成的基准值,可以用time函数的返回值做基准值。>在一次程序运行中,只需要设置一次基准值,后面可以生成多个随机数。>生成a~b之间的随机数的方法:a + rand%(b-a+1)>rand函数生成随机数范围在0~32767之间。调用rand函数、srand函数和time函数。注意此处的强制类型转换,NULL为空指针。

2023-10-28 17:28:50 29 1

原创 求解素数的n重境界(筛选法,试除法)

在上述代码中,我们不难发现6既是2的倍数,又是3的倍数,因此6被重复筛选,为了提高效率,我们可以从素数的平方开始往后筛选,减少了被重复筛选的数字,尤其是在大范围筛选中得到体现,极大提高了程序的效率。1既不是质数,也不是合数,因此首先就要把1划去,2是最小的素数,所以2不能筛去,但是区间内2的倍数要全部筛去,接着3是素数,3也不能筛去,同理3的倍数要全部筛去,然后留下5,7,筛去其全部倍数。而筛选法不是如此,筛选法是将不是素数的数全部去除,然后得到余下的数为素数 ,实现素数的查找。【运用到的数学定理】

2023-10-24 22:34:18 91

原创 求两个整数的最大公约数

分别让变量m和n存储两个数的值,如果n为0,那么停止操作,m中的值是最大公约数(GCD);否则计算m除以n的余数,把n保存到m中,并把余数保存到n中。(remainder表示余数,把余数保存到n中)欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。1997 ÷ 615 = 3 (余 152)反复做除法运算,当余数为 0 时,取当前。615 ÷ 152 = 4(余7)152 ÷ 7 = 21(余5)7 ÷ 5 = 1 (余2)5 ÷ 2 = 2 (余1)2 ÷ 1 = 2 (余0)

2023-10-22 11:45:15 254 1

原创 求n的阶乘(递归与非递归)

double类型比int类型的范围大,能更大程度上避免溢出。

2023-10-21 19:55:32 76 1

原创 【求1加到n的阶乘】

【代码】【求1加到n的阶乘】

2023-10-21 17:51:15 35 1

原创 模拟实现qsort函数

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

2023-10-21 13:11:24 29 1

原创 【二分查找详解】

左边的所有元素,将范围调整为6到10之间。定义 left= 0,right = 9(均为下标),mid 为元素5的下标,在与5比对之后right 不变,left 应改为 mid + 1,接着继续查找。假设第一次是与5比对,目标元素为7,那么此时,目标元素大于被比对元素,可以排除5。

2023-10-16 17:41:20 31 1

原创 【一步一步,脚踏实地】---我的自我介绍

初识C语言,写下人生的第一段代码时,就遇到了重重困难,因为很多小细节导致报错,更无语的是,找不出错误的地方。通过一天一天的学习,我目前写下了3500行左右的代码,当看到程序成功输出想要的结果时,成就感随之而来。思考之后,我明确了我的编程目标。显然,这个目标说的挺含糊,因为我确实不知道编程技术到底要达到什么层次才达到就业要求,所谓一份满意的工作,这里的满意也没有哦定义标准,但也是有了一个前进的方向。对我来说,等的最好姿态是奋斗 ,同时踏踏实实的完成每一件事,这便是我在追求梦想路上的指导方针。

2023-10-11 23:38:43 24 1

原创 【逆序输出详解】

>利用算数分割逆序输出数字的方法>利用scanf函数,在输入时对整数进行切分,从而避免了算数分割以上两种方法对于正整数来说是完全可行的,但是当用户输入负数时,可能无法得到想要的答案。因此,我将在篇末介绍对于正负整数都适用的第三种方法。>逆序输出正负整数的通法

2023-10-10 13:08:57 1012 1

原创 【经典烫问题】

在输出arr1时出现不该出现的结果的原因如下:>printf函数在读取arr1的元素时,只有在遇到【\0】时才会停止输出。>但是数组arr1的元素不是字符串,而是单个字符,不会像字符那样在结尾隐藏着【\0】>因此printf会继续往后读取,这就导致了越界访问,直到遇到【\0】才会停止输出,导致>输出不理想的结果

2023-10-10 10:57:41 19 1

原创 【汉诺塔问题解析】

并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。将a柱上的64片圆盘规定移动到c柱上,一共需要移动约1800亿亿步(18,446,744,073,709,551,615),才能最终完成整个过程。1.将c柱作为辅助,把a柱上的n-1片圆盘移到b柱上。3.将a柱作为辅助,将b上的n-1个圆盘移动到c柱上。1.将c柱作为辅助,把a柱的上面2个圆盘移到b柱上。3.将a柱作为辅助,将b上的2个圆盘移动到c柱上。2.将a柱最下方的第n个圆盘移到c柱上。2片圆盘需要3步完成。

2023-08-25 17:55:34 245 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除