保研机试训练Day-01

Sorting && High precision

Posted by Jeffzzc on March 20, 2025

大纲

排序算法

  • 快排
#include<iostream>
using namespace std;

const int N=1e6+10;
int n;
int q[N];
void quick_sort(int q[],int l,int r){
    if(l>=r) return;
    int x=q[(l+r)/2] , i = l - 1, j = 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]);
    }
    quick_sort(q,l,j);
    quick_sort(q,j+1,r);
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&q[i]);
    }
    quick_sort(q,0,n-1);
    for(int i=0;i<n;i++){
        printf("%d ",q[i]);
    }
    return 0;
}
  • 归并排序
#include<iostream>
using namespace std;
const int N=1e6+10;
int n,q[N],tmp[N];
void merge_sort(int q[],int l,int r){
    if(l>=r) return;
    int mid = (l+r)/2;
    merge_sort(q,l,mid);
    merge_sort(q,mid+1,r);
    int k=0,i=l,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(int i=l,j=0;i<=r;i++,j++){
        q[i]=tmp[j];
    }
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&q[i]);
    merge_sort(q,0,n-1);
    for(int i=0;i<n;i++)printf("%d ",q[i]);
    return 0;
}

高精度

  • 高精度加法
#include<bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;

//  C = A + B
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;
    vector<int> A,B;
    cin >> a >> b;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
  
    auto C = add(A,B);
    for(int i=C.size()-1;i>=0;i--){
        printf("%d",C[i]);
    }
    return 0;
}
  • 高精度减法
#include<bits/stdc++.h>
using namespace std;

const int N = 1e6+10;

bool cmp(vector<int> A,vector<int> 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.size()-1;i>=0;i--) A.push_back(a[i]-'0');
	for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
	if(cmp(A,B)){
		vector<int> C = sub(A,B);
		for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
	}
	else{
		printf("-");
		vector<int> C = sub(B,A);
		for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
	}
	return 0;
}

  • 高精度乘法
#include<bits/stdc++.h>
using namespace std;
vector <int> mul(vector <int> A,int b){
    vector <int> C;
    int t=0;
    for(int i = 0 ; i < A.size() ; i++){
        t += A[i] * b;
        C.push_back(t%10);
        t/=10;
    }
    while(t){
        C.push_back(t%10);
        t/=10;
    }
    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.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    auto C = mul(A,b);
    for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
  
    return 0;
}
  • 高精度除法
#include<bits/stdc++.h>
using namespace std;

//    A/b=c...r
vector <int> div(vector <int> A,int b,int &r){
    vector <int> C;
    r = 0;
    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;
    int r;
    cin>>a>>b;
    vector <int> A;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    auto C = div(A,b,r);
    for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
    cout<<endl<<r<<endl;
  
    return 0;
}