title:算法归纳date: 2021-2-22 8:15
tags: C++
categories: 便签
大数乘法
#include <iostream>#include <string> #include <vector> #include <algorithm>using namespace std;#define Up(i,a,b) for(int i = a;i < b;i++)int main() { string a,b; int t = 0; cin>>a>>b; reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); vector<int> v(a.length() + b.length(),0); Up(i, 0, a.length()){ Up(j, 0, b.length()){ t = (a[i] - '0') * (b[j] - '0') + v[i + j]; v[i + j] = t % 10; v[i + j + 1] += t / 10; //for(int k = v.size() - 1;k >= 0;k--) cout<<v[k]<<' '; //cout<<endl; } } int i; for(i = v.size() - 1;v[i] == 0;i--); for(int j = i;j >= 0;j--){ cout<<v[j]; } return 0;}
v[i + j + 1] += t / 10;
最大公约数和最小公倍数
#include <iostream>using namespace std;typedef long long LL;LL gcd(LL a, LL b){ if(b == 0) return a; else return gcd(b, a%b);}int main() { LL a,b; cin>>a>>b; //求最大公约数 cout<<gcd(a, b)<<endl; //求最小公倍数 cout<<a*b/gcd(a, b); return 0;}
最大公约数用辗转相除法 两数相乘再除以最大公约数得最小公倍数
二分查找
/*二分查找*/int qSearch(int a[], int len, int x) { //返回的是坐标 int left = 0; int right = len - 1; int ans = -1; while (left <= right) { int mid = (left + right) / 2; if (a[mid] == x) { ans = mid; break; } else if (a[mid] > x) right = mid - 1; else left = mid + 1; } return ans;}
递归排序(mergeSort)
void msort(int l, int r) { if (l == r) return; //第一部分,递归 int mid = (l + r) / 2; msort(l, mid); msort(mid + 1, r); int i = l; //第二部分,归并 int j = mid + 1; int k = l; while (i <= mid && j <= r) { if (v1[i] <= v1[j]) v2[k++] = v1[i++]; else { v2[k++] = v1[j++]; } } while (i <= mid) v2[k++] = v1[i++]; while (j <= r) v2[k++] = v1[j++]; for (int i = l; i <= r; i++) v1[i] = v2[i];}
快速排序
void QSort(int L[], int left, int right) //快速排序{ if (left >= right) return; //条出循环 int temp = L[left]; //采用最左边的数作为支点 int i = left, j = right; while (i < j) { while (i < j && L[j] >= temp) j--; L[i] = L[j]; //将比支点小的数移到低端 while (i < j && L[i] <= temp) i++; L[j] = L[i]; //将比支点大的数移到高端 } L[i] = temp; //支点移到i位置上**易错点** QSort(L, left, i - 1); //递归处理左边的数 QSort(L, i + 1, right); //递归处理右边的数}