
C/C++基础算法讲解
文章平均质量分 56
C/C++基础算法讲解
宏阳李老师
从事青少年编程教育多年、中国电子学会会员、CSP-GESP—NOI指导教师、蓝桥杯竞赛指导老师、电子协会等考优秀指导教师
展开
-
二分查找全攻略
一、基本的二分搜索 寻找一个数//基本的二分搜索 寻找一个数int binarySearch(int nums[],int target){ int left=0; int right=length-1; //注意1 两端都是闭区间 while(left<=right){ //注意2 <= int mid=(right-left)/2+left;//等同于(left+right)/2,防止溢出 printf("first:[%d,%d,%d]\n",left,mid,rig原创 2021-10-13 14:17:54 · 181 阅读 · 0 评论 -
中缀表达式转前缀或后缀并计算结果 2021-04-28
#include <cstdio>#include <cmath>#include <iostream>#include <cstring>#include <cstring>#include <string>#include <vector>#include <stack>using namespace std;//运算符的优先级 int get_fast(string op){ in.原创 2021-04-28 16:44:07 · 198 阅读 · 0 评论 -
中缀表达式转后缀表达式(1、2、3) 2021-03-26
中缀表达式是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间,是人们常用的算术表示方法。后缀表达式指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。中缀表达式转后缀表达式 A+(B-C)*D+E/F 的转换为例第一种:基于堆栈的算法下面简述转换方法:1、遇到操作数,直接输出。2、如果不是操作数,分为以下几种情况(1)如果是左括号'(',则入栈。(特别注意左括号'('入栈后优先级为最小。)(...原创 2021-03-26 15:36:32 · 1678 阅读 · 0 评论 -
二分搜索算法 2021-03-05
//写法<一>#include <iostream>using namespace std;int nums[10]={1,3,3,3,4};int binarySearch1(int nums[],int target){//搜索区间[left,right] 寻找一个数 int left=0; int right=4;//注意 while(left<=right){ int mid=left+(right-left)/2; if(nums[mid].原创 2021-03-05 21:20:45 · 148 阅读 · 0 评论 -
斐波那契数列的几种写法 2021-02-23
斐波那契数列的几种写法//递归写法#include<stdio.h>int feibo(int n){ if(n==1) return 0; else if(n<=3) return 1; else return feibo(n-1)+feibo(n-2); }int main(){ int a; scanf("%d",&a); printf("%d\n",feibo(a)); return 0; }//备忘录递归 解决重叠问题#inc.原创 2021-02-23 14:49:20 · 251 阅读 · 0 评论 -
全排列的两种写法 2021-02-17
输出1、2、3、4、5五个数中任选三个数的全排列,其中不允许有重复的组合形式。// C 写法#include <iostream>using namespace std;int a[10],book[10],n;void dfs(int step,int t){ if(step==t+1){ for(int i=1;i<=t;i++) cout<<a[i]<<" "; cout<<endl; return; } fo原创 2021-02-17 15:41:25 · 209 阅读 · 0 评论 -
指针_链表_结构体_类 2021-02-17
//C语言双向链表 #include <stdio.h>struct Node{ //结构体节点 int val; struct Node *next,*pre; Node(int v){ //构造函数 val=v; next=NULL; pre=NULL; }};void push_back(struct Node *head,int val) {//插入尾节点 struct Node *tmp=new struct Node(val); while(h.原创 2021-02-17 11:06:43 · 220 阅读 · 0 评论 -
C语言 -- 字符串详解 2020-12-18
C语言 -- 字符串详解字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中。同时,C 语言提供了一系列库函数来对操作字符串,这些库函数都包含在头文件 string.h 中。一、字符串常量和字符数组1.1、什么是字符串常量 C 语言虽然没有字符串类型,但是 C语言提是存在字符串这个概念的,也就是字符串常量:以 NUL 字节结尾的 0 个或多个字符组成的序列。字符串常量是不可被修改的,一般用一对双引号(" ")括起的一串字符来转载 2020-12-18 14:29:00 · 241 阅读 · 0 评论 -
手工推导阿克曼函数
因为m很小,所以我们可以针对0≤m≤3来对阿克曼函数进行推导对于阿克曼函数的具体推导过程如下:当m=0时:A(0,n)=n+1当m=1时:A(1,n)=A(0,A(1,n-1))=A(1,n-1)+1 =A(0,A(1,n-2))+1=A(1,n-2)+2 =A(0,A(1,n-3))+2=A(1,n-3)+3 ...... =A(1,0)+n =A(0,1)+n =2+n当m=2时:A(2,n)=A(1,A(2,n-1))=...原创 2020-06-04 13:36:28 · 1522 阅读 · 0 评论 -
strstr(str1,str2) 函数与sscanf()函数功能详解
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。strstr(str1,str2)返回的是str2在str1中首次出现的地址,也就是说,strstr(str1,str2)返回值能随str1变化而变化,因为他们内容有共用地址,地址一样,输出的内容也一样。因而,在使用或者处理strstr(str1,str2)返回值之前,切记不要对str1字符串进行更改,若要更改,应该等使用完返回值后再更改!!!..原创 2020-05-26 17:56:45 · 1123 阅读 · 0 评论 -
回溯与搜索 五 数的划分(NOIP2001)
数的划分(NOIP2001)【问题描述】将整数n分成k份,且每份不能为空,任意两种分法不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1;问有多少种不同的分法。【输入格式】n,k (6<n≤200,2≤k≤6)【输出格式】一个整数,即不同的分法。【输入样例】 7 3【...原创 2020-02-11 21:21:53 · 519 阅读 · 0 评论 -
回溯与搜索 四 跳马问题
跳马问题在5*5格的棋盘上,有一只中国象棋的马,从(1,1)点出发,按日字跳马,它可以朝8个方向跳,但不允许出界或跳到已跳过的格子上,要求在跳遍整个棋盘。输出前5个方案及总方案数。输出格式示例:1 16 21 10 2520 11 24 15 2217 2 19 6 912 7 4 23 143 18 13 8 5#include&...原创 2020-02-11 16:27:07 · 1611 阅读 · 0 评论 -
回溯与搜索 三 最高效益 选书
最高效益设有A,B,C,D,E五人从事J1,J2,J3,J4,J5五项工作,每人只能从事一项,他们的效益如下。每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的的一种组合输出。【算法分析】⒈用数组f储存工作选择的方案;数组g存放最优的工作选择方案;数组p用于表示某项工作有没有被选择了。⒉(1)选择p(i)=0的第i项工作; (2)判断效益是否高于max已记录的效益,若...原创 2020-02-11 13:41:03 · 419 阅读 · 0 评论 -
回溯与搜索 二 八皇后问题 马的遍历
八皇后问题:要在国际象棋棋盘中放八个皇后,使任意两个皇后都不能互相吃。(提示:皇后能吃同一行、同一列、同一对角线的任意棋子。)放置第i个(行)皇后的算法为:int search(i){ int j; for(第i个皇后的位置j=1;j<=8;j++) //在i行的8列中逐个去试 if(本行本列允许放置皇后){ 放置第i个皇后; 对放置位置进行标记; if(...原创 2020-02-11 10:25:09 · 397 阅读 · 0 评论 -
回溯与搜索 一 全排列问题
回溯是搜索算法中的一种控制策略。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。 如迷宫问题:进入迷宫后,先随意选择一个前进方向,一步步向前试探前进,如果碰到死胡同,说明前进方向已无路可走,这时,首先看其它方向是否还有路可走,如果有路可走,则沿该...原创 2020-02-07 12:30:06 · 683 阅读 · 0 评论 -
递归的应用
而递归程序设计是C++语言程序设计中的一种重要的方法,它使许多复杂的问题变得简单,容易解决了。递归特点是:函数或过程调用它自己本身。其中直接调用自己称为直接递归,而将A调用B,B以调用A的递归叫做间接递归。【例1】 给定n(n>=1),用递归的方法计算1+2+3+4+...+(n-1)+n。【算法分析】 本题可以用递归方法求解,其原因在于它符合递归的三个条件: (1)本题是累加...原创 2020-02-01 17:52:59 · 571 阅读 · 0 评论 -
(1188:1201:)斐波那契数列
1188:菲波那契数列(2)时间限制: 1000 ms 内存限制: 65536 KB【题目描述】菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。【输入】第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 ≤ a ≤ 10...原创 2019-12-27 10:03:09 · 1963 阅读 · 0 评论 -
高精除以高精
高精除以高精,求它们的商和余数。【算法分析】高精除以低精是对被除数的每一位(这里的“一位”包含前面的余数,以下都是如此)都除以除数。高精除以高精则是用减法模拟除法,对被除数的每一位都减去除数,一直减当前位置的数字(包含前面的余数)小于除数(由于每一位的数字小于10,所以对于每一位最多进行10次计算),具体实现< 方法一 >:#include<iostream>...原创 2019-12-26 17:10:21 · 2516 阅读 · 1 评论 -
快速幂问题
快速幂就是快速算底数的a^n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。以a^10为例。我们知道,求一个数的平方是很快的,因为不用循环。那么a^10能不能转化为谁的平方?没问题,a^10是a^5的平方,也就是说,如果a^5求出来了,那么接下来只需对这个结果平方就能得出结果,并且少做了4次乘法(求平方本身需要一次乘法)!a^5能不能用类似的方法求出来?按照刚...原创 2019-12-26 11:07:00 · 340 阅读 · 0 评论 -
基本的位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。很多高级的动态规划题目或者一些基础的运算往往需要较高的执行效率和较低的空间需求,或者需要表示一些状态集合,而位运算刚好能满足这一切。很多的时候,恰当的位运算使用也能使程序变得更加简洁和优美。位运算应用口诀:清零取反要用与,某位置一可用或若要取反和交换,轻轻松松用异或一:简介1、位逻辑运算...原创 2019-12-24 22:57:21 · 521 阅读 · 0 评论 -
动态数组 vector和关联式容器map
为了节省空间,有时我们会使用动态数组vector。定义vector动态数组:vector<类型名>变量名vector<int>que //定义que为一个int类型的动态数组vector<char> a //定义 a 为一个char 类型的动态数组vector<data> c //其中data为自定义的数据类型,可以为结构体...原创 2019-12-13 11:25:17 · 280 阅读 · 0 评论 -
FIFO队列和优先队列
定义简单的FIFO队列和优先队列//使用队列必须包含 <queue> 头文件queue<int>que;//定义que为一个int类型的FIFO队列 queue<char>a;//定义a为一个char类型的FIFO队列 queue<data>c;//定义c为一个date类型的FIFO队列 //data为自定义的数...原创 2019-12-11 15:56:50 · 671 阅读 · 0 评论 -
string字符串的基本使用
string类型的定义与初始化string s1;//定义一个字符串 string s2(s1);//用s1初始化s2 string s3("world");//将s3初始化为"world" string s4(n,'c');//将s4初始化为n个字符'c'string类型的读写string类型的读写就像其它类的读写一样,使用cin,cout。使用cin读入string类型...原创 2019-12-06 19:33:35 · 1119 阅读 · 0 评论 -
重载运算符
当我们多次使用高精时,我们就会把它写成函数。或许你会疑问,我们难道不能向像int a=3,b=4,c; c=a+b;一样进行运算吗? 答案是肯定的。 接下来我们将介绍如何利用重载运算符进行高精计算。例8.2 运用重载的例子:给出n和m,求出1!+2!+3!+...+n!是否大于m.大于m的话输出”yes”,否则输出”no”.其中0<n<101,m<10^500.【输入格式...原创 2019-12-06 12:23:02 · 230 阅读 · 0 评论 -
互换函数和反转字符串
C语言中互换函数的设置方法一:void chang(int *a,int *b){int temp=*a;*a=*b;*b=temp;}chang(&a[1],&a[2]);printf("%d %d\n",a[1],a[2]);方法二:void chang1(int &a,int &b){int temp=a;a=b;b=temp;...原创 2019-12-05 17:03:31 · 227 阅读 · 0 评论 -
指针及其应用5——指针链表
链表结构【存储方式的分类】 :顺序存储结构和链式存储结构;【顺序存储结构】 :在(子)程序的说明部分就必须加以说明,以便分配固定大小的存储单 元,直到(子)程序结束,才释放空间。因此,这种存储方式又称为静态存储。所定义的变量相应的称为静态变量。它的优缺点如下: 1、优点:可以通过一个简单的公式随机存取表中的任一元素,逻辑关系上相邻的两个元素在物理位置上也是相邻的,且很容易...原创 2019-12-25 16:28:16 · 2439 阅读 · 0 评论 -
指针及其应用4——结构体指针
结构体指针的定义与使用当一个指针变量用来指向一个结构体变量时,称之为结构体指针变量。 结构体指针变量的值是所指向的结构体变量的起始地址。通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的。结构体指针变量定义的一般形式: 结构体名 *结构体指针变量名 当然也可以在定义结构体的同时定义这个结构体指针变量。 例如:(定义一个结构体(类型为自己定义的 st...原创 2019-12-24 21:46:21 · 3052 阅读 · 0 评论 -
指针及其应用3——指针与函数
指针作为函数参数 指针可以作为函数的参数。在函数章节中,我们把数字作为参数传入函数中,实际上就 是利用了传递指针(即传递数组的首地址)的方法。通过首地址,我们可以访问数组中的任 何一个元素。 对于指向其他类型变量的指针,我们可以用同样的方式处理。例如,我们编写如下一个函数,用于将两个整型变量的值交换。void swap(int *x,int *y) { int t=...原创 2019-12-24 21:08:43 · 454 阅读 · 0 评论 -
指针及其应用2——数组指针、字符串指针
指针与数组的关系 指向数组的指针变量称为数组指针变量。一个数组是一块连续的内存单元组成的,数组 名就是这块连续内存单元的首地址。一个数组元素的首地址就是指它所占有的几个内存单元的首地址。一个指针变量即可以指向一个数组,也可以指向一个数组元素,可把数组名或第 一个元素的地址赋予它。如要使指针变量指向第 i 号元素,可以把 i 元素的首地址赋予它,或把数组名加 i 赋予它。设有数组 a,指...原创 2019-12-24 18:28:02 · 635 阅读 · 0 评论 -
指针及其应用1——指针的基本使用
指针变量的定义、赋值一般形式为: 类型说明符 *变量名; 其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示该指 针变量所指向的变量的数据类型。int a=0,b=1;int c[]={1,2,3,4,5,6,7,8,9,10};int *p; //定义一个指针 p=&a; //让p指向a (*p)=3;...原创 2019-12-13 16:03:22 · 494 阅读 · 0 评论 -
数据排序汇总二(希尔排序、快速排序、归并排序)
五.快速排序 快速排序是对冒泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序的序列为{a[L],a[L+1],a[L+2],……,a[R]},首先任意选取一个记录(通常可选中间一个记作为枢轴或支点),然后重新排列其...原创 2020-01-23 20:10:39 · 657 阅读 · 0 评论 -
数据排序汇总一(选择、冒泡、插入,桶排)
一、选择排序基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前,直到全部待排序的数据元素排完。实现步骤如下: ①读入数据存放在a数组中。 ②在a[1]~a[n]中选择值最小的元素,与第1位置元素交换,则把最小值元素放入a[1]中。 ③在a[2]~a[n]中选择值最小的元素,与第2位置元素交换,则把最小值元素...原创 2020-01-23 19:38:06 · 370 阅读 · 0 评论 -
C++利用sort进行排序
sort排序算法必须包含algorithm头文件sort(a+m,a+n);//将数组a的下标为m的元素到下标为n-1的元素进行从小到大排序sort(a+m,a+n,comp); //comp为自定义函数,可以自定义排序规则#include<stdio.h>#include<algorithm>#include<iostream>using...原创 2019-12-06 10:04:53 · 736 阅读 · 0 评论 -
递推算法-五种典型的递推关系
递推算法递推法是一种重要的数学方法,在数学的各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法。这种算法特点是:一个问题的求解需一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,从问题出发逐步推到已知条件,此种方法叫逆推。无论顺推还是逆推,其关键是要找到递推式。这种处理问题的方法能使复杂运算化为若干步重复...原创 2020-01-26 00:03:56 · 16987 阅读 · 10 评论