普通高精度就是把一个很大的数按 11 位分开储存。一般倒着储存(例如 a1a_1 是个位, a2a_2 是十位……)。加减很简单。

例题:洛谷 P1601

代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int y[801]={0},e[801]={0},h[801]={0};
    string s;
    cin>>s;
    int cnt=1;
    for(int i=0;i<s.length();i++){
        if(s[i]>='0'&&s[i]<='9'){
            y[cnt++]=s[i]-'0';
        }
    }
    cnt--;
    cin>>s;
    int k=1;
    for(int i=0;i<s.length();i++){
        if(s[i]>='0'&&s[i]<='9'){
            e[k++]=s[i]-'0';
        }
    }
    k--;
    if(k<cnt){
        int c=cnt-k;
        for(int i=cnt;i>c;i--){
            e[i]=e[i-c];
            e[i-c]=0;
        }
        k=cnt;
    }
    else if(k>cnt) {
        int c=k-cnt;
        for(int i=k;i>c;i--){
            y[i]=y[i-c];
            y[i-c]=0;
        }
        cnt=k;
    }
    int j=0;
    for(int i=cnt;i>=0;i--){
        h[i]=(y[i]+j+e[i])%10;
        j=(y[i]+j+e[i])/10;
    }
    bool b=false;
    for(int i=0;i<=cnt;i++){
        if(b||h[i]){
            cout<<h[i];
            b=true;
        }
    }
    if(!b) cout<<0;
    return 0;
}

乘法要计算好位数,第 ii 位与第 jj 位的乘积在第 i+j1i+j-1 位。

例题:洛谷P1303

代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin>>s;
    int len1=0;
    int a[2001]={0},b[2001]={0},c[4001]={0};
    for(int i=0;i<s.length();i++){
        if(s[i]>='0'&&s[i]<='9'){
            a[++len1]=s[i]-'0';
        }
    }
    cin>>s;
    int len2=0;
    for(int i=0;i<s.length();i++){
        if(s[i]>='0'&&s[i]<='9'){
            b[++len2]=s[i]-'0';
        }
    }
    if(len1<len2){
        int c=len2-len1;
        for(int i=len2;i>c;i--){
            a[i]=a[i-c];
            a[i-c]=0;
        }
        len1=len2;
    }
    else if(len1>len2){
        int c=len1-len2;
        for(int i=len1;i>c;i--){
            b[i]=b[i-c];
            b[i-c]=0;
        }
    }
    int w=0;
    int j=0;
    for(int i=len1;i>0;i--){
        w++;
        int p=w;
        for(int jj=len1;jj>0;jj--){
            c[4001-p]+=j+a[jj]*b[i];
            j=c[4001-p]/10;
            c[4001-p]%=10;
            p++;
        }
        if(j>=1) c[4001-p]+=j;
        j=0;
    }
    bool bb=false;
    for(int i=0;i<4001;i++){
        if(bb||c[i]>0){
            bb=true;
            cout<<c[i];
        }
    }
    if(!bb) cout<<"0";
    return 0;
}

除法就是把除数扩大 10n10^n ,使除数与被除数一样位数,再减。然后再把除数不断除以 1010 就好了。

例题(高精除以低精):洛谷P1480

代码:

#include<string>
#include<iostream>
using namespace std;
string a,c;
int b,i,d;
int main()
{
    cin>>a>>b;
    for (;i<a.length();i++)a[i]-=48;
    for (i=0;i<a.length();i++)
        c.push_back((d*10+a[i])/b+48),d=(d*10+a[i])%b;
    for (i=0;c[0]==48;i++)c.erase(c.begin(),c.begin()+1);
    cout<<c;
    return 0;
}

压位高精就是每个数组都存储比较多的位数(例如 intint 类型的数组就存储 99 位)。其实和普通高精差不多。这里就不放代码了。