快速排序
// 快速排序
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
int q[N];
void quick_sort(int q[], int l , int r){
if(l >= r) return;
int i = l-1 ; int j = r+1 ; int x = q[(l+r)>>1];
while(i < j){
do{
i++;
}while(q[i] < x); // 找到左边比较中间那个大的数
do{
j--;
}while(q[j] > x); // 找到右边比中间那个数大的数
if(i < j){
swap(q[i], q[j]); // 找到的那两个数在进行交换就OK
}
}
quick_sort(q, l, j); // 左边的数进行排序
quick_sort(q, j+1, r); // 右边的数进行排序
}
int main(){
int n ; cin >> n;
for(int i = 0 ; i < n ; i++){
cin >> q[i];
}
quick_sort(q, 0, n-1);
for(int j = 0 ; j < n ; j++){
cout << q[j] << " ";
}cout << endl;
return 0;
}
归并排序
// 归并排序
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], tmp[N];
void merge_sort(int q[], int l , int r){
if(l >= r) return ;
int mid = (l+r) >> 1;
merge_sort(q, l, mid), merge_sort(q, mid+1, r);
// 将全部的数都拆散开来
int k = 0 ; int i = l ; int j = mid+1;
while(i <= mid && j <= r){
if(q[i] <= q[j]){
tmp[k++] = q[i++];
}
else{
tmp[k++] = q[j++];
}
}
while(i <= mid){
tmp[k++] = q[i++];
}
while(j <= r){
tmp[k++] = q[j++];
}
for(i = l , j = 0 ; i <= r ; i++, j++){
q[i] = tmp[j];
}
}
int main(){
int n ; cin >> n;
for(int i = 0 ; i < n ; i++){
cin >> a[i];
}
merge_sort(a, 0, n-1);
for(int j = 0 ; j < n ; j++){
cout << a[j] << " ";
}cout << endl;
return 0;
}
高精度算法
高精度加法
// 高精度加法
#include<bits/stdc++.h>
using namespace std;
vector<int> add(vector<int>& A , vector<int>& B){
vector<int> C;
int t = 0;
for(int i = 0 ; i < A.size() || i < B.size(); i++){
if(i < A.size()){
t += A[i];
}
if(i < B.size()){
t += B[i];
}
C.push_back(t % 10);
t /= 10;
}
if(t){
C.push_back(1);
}
return C;
}
int main(){
string a, b ; cin >> a >> b;
vector<int> A, B;
for(int i = a.length()-1 ; i >= 0 ; i--){
A.push_back(a[i] - '0');
}
for(int i = b.length()-1 ; i >= 0 ; i--){
B.push_back(b[i] - '0');
}
vector<int> ans = add(A, B);
for(int i = ans.size()-1 ; i >= 0 ; i--){
cout << ans[i];
}
return 0;
}
高精度减法
// 高精度减法
#include<bits/stdc++.h>
using namespace std;
bool cmp(vector<int>& A, vector<int>& B){ //判断A>=B
if(A.size() != B.size()){
return A.size() > B.size();
}
for(int i = A.size()-1 ; i >= 0 ; i--){
if(A[i] != B[i]){
return A[i] > B[i];
}
}
return true;
}
vector<int> sub(vector<int>& A , vector<int>& B){
vector<int> C;
for(int i = 0 , t = 0 ; i < A.size(); i++){
t = A[i] - t;
if(i < B.size()){
t -= B[i];
}
C.push_back((t+10)%10);
if(t < 0) t = 1;
else t = 0;
}
while(C.size() > 1 && C.back() == 0){
C.pop_back();
}
return C;
}
int main(){
string a, b ; cin >> a >> b;
vector<int> A, B;
for(int i = a.length()-1 ; i >= 0 ; i--){
A.push_back(a[i] - '0');
}
for(int i = b.length()-1 ; i >= 0 ; i--){
B.push_back(b[i] - '0');
}
vector<int> ans;
if(cmp(A, B)){
ans = sub(A, B);
}
else{
ans = sub(B, A);
cout << "-";
}
for(int j = ans.size()-1 ; j >= 0 ; j--){
cout << ans[j];
}
return 0;
}
高精度乘法
// 高精度乘法
#include<bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int>& A, int B){
vector<int> C;
for(int i = 0 , t = 0 ; i < A.size() || t ; i++){
t += A[i] * B;
C.push_back(t % 10);
t /= 10;
}
return C;
}
int main(){
string a;
vector<int> A;
int B;
cin >> a >> B;
for(int i = a.length()-1 ; i >= 0 ; i--){
A.push_back(a[i] - '0');
}
vector<int> ans = mul(A, B);
for(int i = ans.size()-1 ; i >= 0 ; i--){
cout << ans[i];
}
return 0;
}
高精度除法
// 高精度除法
#include<bits/stdc++.h>
using namespace std;
vector<int> div(vector<int>& A, int b , int& r){
vector<int> C;
for(int i = A.size()-1 ; i >= 0 ; i--){
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(), C.end());
while(C.size() > 1 && C.back() == 0){
C.pop_back(); // 去零
}
return C;
}
int main(){
string a ; int b ; cin >> a >> b;
vector<int> A;
for(int i = a.length()-1 ; i >=0 ; i--){
A.push_back(a[i] - '0');
}
int r;
vector<int> ans = div(A, b, r);
for(int i = ans.size()-1 ; i >= 0 ; i--){
cout << ans[i];
}cout << endl;
return 0;
}
快速幂算法
链接:【快速搞懂快速幂龟速乘】https://www.bilibili.com/video/BV1i44y1q7ck?vd_source=1bdf2769003824b5e26162b237ab82d5
// 快速幂算法
// (a*b)%c 相当于[(a%c)*(b%c)]%c
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int qmi(int a , int b , int p){
int res = 1;
while(b){
if(b & 1){ // 判断b的二进制最后一项是否为1
res = (ll)res * a % p;
}
a = (ll)a * a % p;
b >>= 1; // b的二进制向右移动一位,相当于除2
}
return res;
}
int main(){
int n ; cin >> n;
for(int i = 0 ; i < n ; i++){
int a, b, p;
cin >> a >> b >> p;
cout << qmi(a, b, p) << endl;
}
return 0;
}
龟速乘(快速乘)
// 龟速乘
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qmul(ll a, ll k, ll b){
ll res = 0;
while(k){
if(k & 1){
res = (res + a) % b;
}
a = (a + a) % b;
k >>= 1;
}
return res;
}
int main(){
ll a, b, p ; cin >> a >> b >> p;
cout << qmul(a, b, p) << endl;
return 0;
}
一维前缀和
// 一维前缀和
#include<bits/stdc++.h>
using namespace std;
const int n = 5;
int sum[n] = {0};
int get_num(int L, int R){
if(L != 0){
return sum[R] - sum[L-1];
}
return sum[R];
}
// 对这个函数进行简化得到
// #define get_num(L, R) (L?sum[R]-sum[L-1] : sum[R])
int main(){
int arr[n] = {1, 3, 7, 5, 2};
sum[0] = arr[0];
for(int i = 1 ; i < n ; i++){
sum[i] = sum[i-1]+arr[i];
}
cout << get_num(2, 4) << endl;
cout << get_num(0, 3) << endl;
cout << get_num(3, 4) << endl;
return 0;
}