高精度计算(C++)
C++中实现大整数的加减乘除的计算~
高精度计算
大整数的加法计算
大整数存储方法
计算的值应该是反向存储在数组中,方便数组进位的计算~
模拟加法计算的过程
从末尾进行计算,如果存在 进位就给下一位加一进位计算,直到计算完成。
代码实现:
12345678910111213141516171819202122232425262728#include <iostream>#include <cstdio>#include <vector>using namespace std;//模拟大数相加的过程vector<int> add(vector<int> &a, vector<int> &b){ vector<int> ans; int t = 0; for (int i = 0; i < a.size() || i < b.size(); i++){ if (i < a.size()) t += ...
快速排序与归并排序算法
在之前的基础上将快速排序和归并排序重写形成了模板 在y 总那里学来的 ~
排序算法
快速排序
快速排序思想
快速排序的思想:基于分治的思想 选择一个分界点 使分界点的左侧的值比它小,右侧的值比它大, 不满足则交换,递归直到数组有序。
步骤
快速排序算法的步骤:
确定数组的分界点 一般为arr[l], arr[(i + l) / 2], arr[r] 或随机
调整区间 假设边界点为x,小于等于x在x左边, 大于等于x的在x右边。
递归执行此过程,直到数组的为有序的。
代码实现
结合以上的思路快速排序代码:
1234567891011121314151617181920212223242526/*快速排序的代码模板的使用*/#include <iostream>#include <cstdio>using namespace std;const int N = 1e6 + 10;int n, q[N];// 以左边的值为边界点 进行排序void quick_sort(int q[], int l, int r){ if ...
喂,当你想放弃了就来看看
国庆假期本来是安安心心在自习室复习准备明年考研的,之前的同学叫我去武汉,其实心中一直对武汉大学憧憬,这也算是我来武汉的初衷吧
武汉大学
牌坊
校训
进门就是武大的校训了~
计算机学院
作为一名程序员,有什么景色都先不管,肯定要去人家的计算机学院啦~ 羡慕, 自己要是能去就好了~
可惜没去成人家图书馆,学校实在大旁边的那两个走不动啦~
校园骑行
博物馆
鉴湖
樱花大道
可惜这个时间没有樱花
樱园
樱园宿舍
貌似是博士生才能住的宿舍,环境优美~
樱园上方的城堡
梅园操场
珞珈山
月湖
其他
这张就像电影里的那种感觉~ 很惬意
东湖
总结
武大的校园氛围给人莫名的舒适,自由。武大很美,但是真正对我很大感触并不在此,而在于—当我骑上车想到能够 在这种氛围下,骑着车和几个挚友谈谈心,排解排解压力,谈谈生活,一起为课业忙碌,拼搏, 一起因为那些烦恼而忧虑,一起为生活奋斗,其实这就是我心中的那份美好吧,我一直所追求的。说实话,上了三年大学,这是我人生中第一次在大学的校园骑车,直到那一刻我真正明白努力生活的意义,我也明白自己真正想要的是什么, ...
Kruskal算法构建最小生成树
最小生成树的实现——Kruskal算法
Kruskal算法的思想
Kruskal算法是一种通过按权值依次递增的次序来选择适当的边来构建最小生成树的,在无向连通网G=(V,E)中,假设G的最小生成树为T=(V,{}),起始转态最小生成树有G中的全部顶点构成,并且没有任何一条边,之后按照边的权值有递增的顺序排列,依次查询G中的边集E,如果查询的边的两个顶点属于两个不同的连通分量,就将这条边纳入到T中去,并将两个连通分量连接为一个连通分量,如果查询的边的两个顶点属于一个连通分量就舍弃此边,避免造成回路。反复执行此过程,当T中的连通分量的个数为1时,这样我们也就找到了最小生成树。
Kruskal算法的图解过程
假设我们给定如下的图,通过Kruskal算法的思想应该怎么构成最小生成树呢?
刚刚说的概念可能还是不太理解的话,那么简单一句话总结,按照权值依次递增 的顺序选取边,如果构成回路,就将此边舍去。接下来就看一下图解过程:
第一次构建:
第二次构建:
第三次构建:
第四次构建:
5.第五次构建:
6.第六次构建:
实现Kruskal算法添加的关键结构
通过刚刚的构建 ...
Dijkstra算法实现最短路径
最短路径的实现——Dijkstra算法
Dijkstra算法实现最短路径
概述
现在给出一个无向网G现在让你从0点开始 求出到每个点的最短路径 如下图:
首先我们也不需要去考虑什么算法怎么去实现啊,怎么写代码之类的问题,现在就考虑一下如果让我们自己去选择最短路径,选择出来一个路径会是什么样的呢?
以人正常的思维就是从起始点依次开始找下一个点,并保证当前的选择是距离最短的步骤如下
以vo为起始点,有v0-v2,v0-v1两条路线可以选择,距离短的明显就是1,即v0-v1的最短路径为1,所以在走之后的路径时就以v1探索,找接下来找那个点路径最短。
从v1开始 有v0-v1-v2,v0-v1-v3,v0-v1-v4,通过观察还是从v1到v2的路径更短,选择v2 ,此时v0-v2的最短路径就选出来了。
从v2起始有两种选择v0-v1-v2-v4,v0-v1-v2-v5,观察还是由v2-v4的路径更短,选择v4 此时从v0-v4的最短路径就找到了。
以此类推,就可以找到最短的路径
通过刚刚叙述的思想得到最短路径 如下图:
Dijkstra算法思想
Dijkstra的思想就 ...
线索二叉树的建立(c实现)
线索二叉树的建立
线索二叉树
线索二叉树概念
二叉树通过二叉链表作为存储结构时,只能得到当前结点的左右孩子信息,而无法得到结点在任一序列的前驱和后继,如果想要保存遍历中的信息,需要在每个结点上添加两个指针域,分别指向当前结点的前驱和后继,指向线性序列中的前驱和后继的指针,称为线索,
并且增加两个标志域 如下图
设置规定如下:
ltag=0 表示lchild 指向左孩子
latg=1 表示lchild 指向前驱
rtag=0 表示rchild 指向右孩子
rtag=1 表示rchild 指向后继
按照上述的原则 在二叉树中添加线索的过程叫二叉树的线索化
线索二叉树图解
假设给定下图的二叉树
这时可以根据中序遍历的结果来对二叉树线索化 ,中序遍历的结果为:DGBAECF
如下图
实线指的是二叉树所指向的结点
虚线指的是线索
解释一下 建立线索的过程
A节点左右孩子存在,ltag=0,lchild指向左孩子B,rtag=0 ,rchild指向右孩子C。
B节点左孩子存在 ltag=0,lchild指向左孩子D,右孩子不存在 rtag=1,根据中序遍历的结果B的后继为 ...
图的建立——邻接矩阵
通过邻接矩阵实现图的存储
图的存储结构
通过邻接矩阵的方式建立图
邻接矩阵(Adjacency Matrix)的存储结构就是通过一维数组存储图中顶点的信息,用矩阵表示图中各个顶点的的临界关系,而矩阵通过一个二维数组表示。
图的分类及表示
图的矩阵中表示方法
在无向图中矩阵的表示
无向网中矩阵的表示
存储顶点信息的结构
存储图的信息时,要通过结构体来定义数据类型,以无向网为例定义如下:
12345678#define MAX_VEX 100 // 图中含有顶点的最多个数#define INF 65535 //如果两个顶点之间不可达,用无穷表示距离struct Graph{ char vexs[MAX_VEX]; //代表顶点信息的名称 int arc[MAX_VEX][MAX_VEX]; //两个顶点之间的权值 int numvex; // 表示顶点的个数 int numarc; // 边的个数};
图信息的初始化
1234567891011121 ...
最小生成树的建立——Prim算法
最小生成树的建立——Prim算法
概述
生成树的概念
要建立最小生成树,首先要知道什么是生成树,了解生成树的概念才可以
假设在连通图G中有n个顶点, 将G中的n-1条边 构成无回路的连通图称为生成树。
最小生成树的概念
图的生成树不是唯一的,在一个图中可能存在多个生成树,将个边权值相加之和最小的生成树, 称为最小生成树。
Prim算法
思路:Prim算法将顶点分为两部分,U和V-U,U中的顶点代表当前生成最小生成树的顶点,V—U就是没有处理过的顶点,起始时将全部的顶点之间的边作为候选边,依次从中选取权值最小的边作为最小生成树的边,不断修正U,直到得到构成最小生成树全部的顶点。
prim实现的过程
设置关键数组
设置lowcost数组来存储边的权值,如果lowcost[i]=0表示 表名i就在U中,已经找构成最小生成树的点。
closevertex数组表示构成最小生成树相邻的顶点,理解当前构成最小生成的前驱,这个具体在运行的结果中看到,一会在看到输出结果是详细解释。
实现最小生成树的图解
以下图为例 以V0为起始点图中为了方便观看省去了V:
初始化两个数组有:
...
通过C++中的引用建立链表
通过C++中的引用建立链表
通过C++中的引用建立链表
通过C++引用语法实现对链表的改动
void change( int &a, int &b)
change(a,b);
int &a 相当于a的别名,er int &a 是双向的可用的在C语言我改变元>素的值通常使用指针改变函数的值,通过传递其地址
代码如下:
#include <iostream>
#include<cstdio>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}link,*linkednode;
// 在此使用头插法完成链表的建立
void CreateLink(linkednode &L)
{
linkednode s;
L=(linkednode)malloc(sizeof(link));
L->next=NULL;
for(int i=0; ...
二叉树的建立以及遍历
二叉树的建立以及遍历
二叉树的建立以及遍历
利用递归的方式建立二叉树 并以中序遍历的方式读取数据,根据遍历二叉树的三种方式,只需要在递归时修改访问结点的元素即可。
123456789101112131415161718192021222324252627282930313233343536373839404142#include <stdio.h>#include <stdlib.h> typedef struct Binode{ char data; struct Binode *Rchild ,*Lchild; }BiTnode,*BiTree; void createBTree( BiTree *T) { char c ; scanf("%c",&c); if(' '==c){ *T=NULL; } else{ *T=(BiTnode*)malloc ...