
基础算法模板
包含一些基础算法的板子,考前背一背233333
lvonge
一只菜鸡
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
大整数相加与相减
两个大整数相加或相减的问题是很经典的问题。 先输入两个大整数,用string保存,然后转换成自定义的大整数的值。 最后先输出两个数的相加的值,再输出两个数的相减的值。 #include <iostream> #include <algorithm> #include <cstdio> #include <string> using namespace std; typedef struct bignum{ int d[1000]; int le原创 2020-05-31 23:30:06 · 454 阅读 · 0 评论 -
基于C++的string方法来解决大数相加问题
大数相加问题一直是一个很经典的算法问题。给定两个非常非常大,大到超越了不可能用int,long long int等类型表示的数字,所以就要用其他的方法。 我的解决方案是使用两个string来保存数字,然后再模拟两个数字相加的情况。最后再输出。 #include <iostream> #include <string> #include <algorithm> using namespace std; int main(){ string a,b,c="";原创 2020-05-31 18:03:43 · 485 阅读 · 1 评论 -
筛法求素数
实际上,除了对每一个素数进行单点判定的方法外,筛法也可以快速的求出大规模的素数。 例如 2是素数,那么所有以2为倍数的数字(例如4 6 8 10 12等等)肯定都不是素数了。 那么我们需要做的就是从2开始筛选,直到筛选出题目要求的所有的素数即可。 先输入两个数字M和N(M < N),然后就输出M和N之间的所有的素数。 #include <iostream> using namespace std; const int maxn = 110; bool prime[maxn] = {fals原创 2020-05-31 16:49:51 · 508 阅读 · 0 评论 -
基于单点判定的方法来判定素数
素数指的就是,该数不可以被除了该数本身和1其他的数整除。 本方法对每一个数都进行了判定。 先输入数字N,然后再数入N个数字,每次输入一个数字,都判定该数字是不是素数。如果是素数,就输出YES,否则输出NO。 #include <iostream> #include <cmath> using namespace std; bool is_prime(int n){ if(n <= 1) return false; int sqr = (int)sqrt(n*1.原创 2020-05-31 16:30:22 · 148 阅读 · 0 评论 -
基于辗转相除法求最小公倍数
先输入m和n,则先求出m和n的最大公约数,再令m和n的乘积除以最大公约数,所得即为最小公倍数。 #include <iostream> #include <algorithm> using namespace std; int gcd(int a,int b){ if(b == 0) return a; else return gcd(b,a % b); } int main(){ int m,n; cin >> m >> n;原创 2020-05-31 16:07:23 · 1009 阅读 · 2 评论 -
辗转相除法实现求两个数的最大公约数
使用辗转相除法来实现求两个数的最大公约数。 只需要先输入两个数字,然后就能输出这两个数字的最大公约数。 #include <iostream> #include <algorithm> using namespace std; int gcd(int a,int b){ if(b == 0) return a; else return gcd(b,a % b); } int main(){ int m,n; cin >> m >>原创 2020-05-31 16:01:33 · 624 阅读 · 0 评论 -
快速排序
快速排序的作用是,先将对一个区间的数据进行排序。使目前区间中某一个数的右边的所有数字全都比它小,左边的所有数字全都比它大。之后再对左边和右边两个区间实行这样的操作,知道数据区间内只有一个数字。 在本代码中,选择区间中的第一个数字,使其区间经过排序后该数字的左边的所有数字都比该数字小,右边的所有数字都比该数字大。 #include <iostream> using namespace std; const int maxn = 100; int A[maxn],n; int partitions(原创 2020-05-31 14:42:49 · 168 阅读 · 0 评论 -
归并排序的循环实现
归并排序的循环实现的原理和递归是一样的,只是把递归改成了循环。 详情可戳:递归排序的递归实现 代码如下: #include <iostream> #include <algorithm> using namespace std; const int maxn = 110; int n,one,A[maxn]; void merges(int A[],int L1,int R1,int L2,int R2){ int i = L1,j = L2,temp[maxn],index原创 2020-05-31 14:08:59 · 581 阅读 · 0 评论 -
归并排序的递归实现
归并排序是一种很经典的算法。 原理就是 把一个数组按照五五开的方式分成小块,然后再一个一个的归并起来。 在归并的过程之中,也要保证两个区间内的数字在归并前的时候是有序的,并且在归并完成之后也是有序的。这样一直归并下去,直到数据的区间是数组头到数组尾。 #include <iostream> #include <vector> using namespace std; vector<int> w; void merges(int L1,int R1,int L2,int R原创 2020-05-31 13:18:38 · 200 阅读 · 0 评论 -
快速幂
快速幂是快速解决a的b次方对m进行取模的问题。 通常来说,求a的b次方对m的%,就是用一个循环,然后让a乘以自己,持续b次。但是在数据量太大的情况下,很可能会超时。 所以就有了快速幂的方式。 使用&的方式判定b所对应的二进制结尾(二进制代码最右边)是1还是0从而判断b是奇数还是偶数。 再用b >>符号来让b右移1位,相当于抹去最右边的一位二进制。 #include <iostream> using namespace std; typedef long long LL; LL原创 2020-05-29 21:32:57 · 249 阅读 · 0 评论 -
二分查找
二分查找算法是一种很简单的算法。可以很快的找出某一个数字的序号,但是需要注意的是二分查找只能在有序数组的基础上查找。 先输入一个整数N,再输入N个整数,这N个整数就组成了一个数组。最后再输入M和M个数字,每次输入一个数字,都会输出这个数字在数组中的位置。 输出位置的时候,默认的开始下标为0. #include <iostream> #include <algorithm> #include <vector> using namespace std; vector<i原创 2020-05-29 12:36:40 · 188 阅读 · 0 评论 -
基于全排列的N皇后暴力
N皇后是算法的经典问题,以下提供一种基于全排列的N皇后的解法。 首先,N皇后的起始要求是指的是 不能有任意两个皇后是同行、同列、同一个斜排。所以可以很自然的联想到全排列来解决这个问题。 例如,1 2 3的全排列有1 2 3,1 3 2,2 1 3,2 3 1,3 2 1,3 1 2六种。它们可以看做是六种皇后摆放的位置描述。 举个栗子,1 3 2 可以看做第一行第一列放置一个皇后,第二行第三列放置一个皇后,第三行第二列放置一个皇后。3 1 2也可以看做是第一行第三列放置一个皇后,第二行第一列放置一个皇后,第原创 2020-05-29 12:09:01 · 260 阅读 · 0 评论 -
全排列
很简单的全排列算法,基于vector和递归生成。 首先输入一个数N,代表要排列的数的个数,再输入N个数。然后进行全排列并且输出。 #include <iostream> #include <cstdio> #include <vector> #include <algorithm> using namespace std; const int maxn = 1010; int n,one,res[maxn]; vector<int> p; bool原创 2020-05-29 11:47:21 · 162 阅读 · 0 评论 -
插入排序
很经典的插入排序算法。和选择排序一样,也很简单。 把数组分为有序和无序两个部分,然后再将无序部分中的第一个数插入有序部分,使得有序部分仍然有序并且变大,无序部分变小。 #include <iostream> #include <vector> using namespace std; vector<int> A; void insertSort(){ for(int i = 1;i < A.size();i ++){ int j = i,te原创 2020-05-28 10:01:17 · 125 阅读 · 0 评论 -
选择排序
非常简单的选择排序代码,使用vector实现。 思路就是将数组分成无序和有序两个部分。然后每次在无序的部分中找到一个最小的值放在有序的部分中。时间复杂度为O(N^2),考场上建议直接使用sort()。 #include <iostream> #include <vector> using namespace std; vector<int> res; void selectSort(){ for(int i = 0;i < res.size();i ++){原创 2020-05-28 09:39:55 · 162 阅读 · 0 评论 -
进制转换(支持十进制以上的情况)
基础的进制转换模板 支持10进制以上,大于十进制的位数用大写字母表示 首先 输入一个数字和其进制,就能输出其数字的十进制数。 再输入一个十进制数字和其进制,就能输出其数字的进制数。 第一次输入数字的时候,可以输入大写英文字母来表示大于10的数字。 #include <iostream> #include <string> #include <sstream> #include <algorithm> using namespace std; void to_原创 2020-05-28 09:01:52 · 493 阅读 · 1 评论