高精集合

高精加和高精乘都不是逆运算,思路较简单就不进行解析(况且高精加还发过)

高精乘:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
char a1[100001],b1[100001];
int a[100001],b[100001],c[100001];
int wei=0;
int max(int x,int y){
    int ans;
    ans=x>y? x:y;
    return ans;
}
int main(){
    scanf("%s%s",a1,b1);
    int la=strlen(a1);
    int lb=strlen(b1);
    int m=max(la,lb);
    for(int i=la-1;i>=0;i--){
        a[la-i]=a1[i]-'0';
    }
    for(int i=lb-1;i>=0;i--){
        b[lb-i]=b1[i]-'0';
    }
    for(int i=1;i<=la;i++){
        wei=0;
        for(int j=1;j<=lb;j++){
            c[i+j-1]=a[i]*b[j]+wei+c[i+j-1];
            wei=c[i+j-1]/10;
            c[i+j-1]=c[i+j-1]%10;
        }
        c[i+lb]=wei;
    }
    int lc=la+lb;
    while(c[lc]==0&&lc>1)
        lc--;
    for(int i=lc;i>=1;i--){
        cout<<c[i];
    }
    return 0;
}

高精减:

数据范围:10000位以内非零整数

#include<bits/stdc++.h>
using namespace std;
char a[10005];
char b[10005];
int a1[10005];
int b1[10005];
int c[10005];
int la,lb,m;
bool nati;
void ad(){
    for(int i=1;i<=m;i++){
        if(a1[i]>=b1[i]) c[i]=a1[i]-b1[i];
        else{
            a1[i+1]--;
            c[i]=a1[i]+10-b1[i]; //处理退位
        }
    }
}
void ad1(){                                 //b>a的特殊情况
    for(int i=1;i<=m;i++){
        if(b1[i]>=a1[i]) c[i]=b1[i]-a1[i];
        else{
            b1[i+1]--;
            c[i]=b1[i]+10-a1[i];
        }
    }
}
int main(){
    scanf("%s%s",a,b);
    la=strlen(a);
    lb=strlen(b);
    m=max(la,lb);
    for(int i=la-1;i>=0;i--) a1[la-i]=a[i]-48;
    for(int i=lb-1;i>=0;i--) b1[lb-i]=b[i]-48;
    for(int i=0;i<=m-1;i++) a[i]=a1[m-i]+48;
    for(int i=0;i<=m-1;i++) b[i]=b1[m-i]+48;
    if(strcmp(a,b)<0) nati=1;
    bool ok=0;
    if(!nati) ad();
    if(nati){
        cout<<"-";
        ad1();
    }
    for(int i=m;i>=1;i--){
        if(c[i]) ok=1;
        if(ok==0) continue;
        cout<<c[i];
    }
    if(ok==0) cout<<0;
    return 0;
}

高精除:

只适用于高精除以低精

#include<bits/stdc++.h>
using namespace std;
char a1[5005];
int a[5005];
int c[5005];
int b;
int main(){
    scanf("%s%d",a1,&b);
    int l=strlen(a1);
    for(int i=1;i<=l;i++) a[i]=a1[i-1]-'0';
    for(int i=1;i<=l;i++){
        c[i]=a[i]/b;
        a[i+1]+=(a[i]%b)*10;//有由高位向低位除,余数给低位
    }
    int i=0;
    while(!c[i]) i++;
    if(i!=l-1) for(i;i<=l;i++) cout<<c[i];//处理前导零
    else cout<<0;
    return 0;
}

这就是高精基本运算

posted @ 2019-04-05 20:42  _Alex_Mercer  阅读(199)  评论(0编辑  收藏  举报