日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

高精 by jzzcjb

發布時間:2023/12/13 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 高精 by jzzcjb 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

每個OIER都應該有一個屬于自己的高精模板

——沃茲·基·碩德華

高精板子

支持 min,max,判==,比較大小,正數減負數,負數減正數,負數加正數,負數乘正數,高精除低精(含正負),int 轉高精,高精讀入輸出(含正負)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct bign{
    int len;
    int num[15010];
    bool flag;
    bign(){len=1;flag=0;memset(num,0,sizeof num);}
    bign(int x){
        len=0;flag=(x<0);x=(x<0)?-x:x;
        while(x) num[++len]=x%10,x/=10;
    }
    void read(){
        memset(num,0,sizeof(num));
        char s[100001];cin>>s;len=strlen(s);
        if(s[0]=='-'){flag=1;len--;
            for(int i=1;i<=len;i++)
            num[i]=s[len-i+1]-'0';
        }
        else{flag=0;
            for(int i=1;i<=len;i++)
            num[i]=s[len-i]-'0';
        }
    }
    void write(){
        if(flag&&num[len]!=0) cout<<"-";
          for(int i=len;i>=1;i--) cout<<num[i];
    }
};
void Swap(bign &a,bign &b){
    bign c;
    c=a;a=b;b=c;
}
bool operator < (bign a,bign b){
    if(a.len!=b.len) return (a.len<b.len);
    for(int i=a.len;i>=1;i--)
    if(a.num[i]!=b.num[i]) return (a.num[i]<b.num[i]);
}
bool operator > (bign a,bign b){
    return (a<b)?0:1;
}
bool operator == (bign a,bign b){
    if(a.len!=b.len)return 0;
    for(int i=1;i<=a.len;i++)if(a.num[i]!=b.num[i])return 0;
    return 1;
}
bign max(bign A,bign B){return (A>B)?A:B;}
bign operator - (bign a,bign b);
bign operator + (bign a,bign b){
    bign ans;
    if(a.flag&&b.flag) ans.flag=1;
    if(a.flag&&!b.flag){b.flag=1;return a-b;}
    if(!a.flag&&b.flag){a.flag=1;return b-a;}
    int i=1,x=0;
    while(i<=a.len||i<=b.len){
        ans.num[i]+=x;ans.num[i]+=(a.num[i]+b.num[i]);
        x=ans.num[i]/10;ans.num[i]%=10;  i++;
    }
    ans.num[i]=x;
    if(!ans.num[i])i--;
    ans.len=i;
    return ans;
}
bign operator - (bign a,bign b){
    bign ans;
    if(a.flag&&b.flag) ans.flag=1;
    if(a.flag&&!b.flag){b.flag=1;return a+b;}
    if(!a.flag&&b.flag){a.flag=0;return a+b;}
    if(a==b)return ans;
    if(a<b) Swap(a,b),ans.flag^=1;
    for(int i=1;i<=a.len;i++){
        if(a.num[i]<0)a.num[i]+=10,a.num[i+1]--;
        ans.num[i]=a.num[i]-b.num[i];
        if(ans.num[i]<0){
            ans.num[i]+=10; a.num[i+1]--;
        }
    }
    int len=max(a.len,b.len);
    while(ans.num[len]<=0&&len>1)len--;
    ans.len=len;
    return ans;
}
bign operator * (bign a,bign b){
    bign ans;
    ans.flag=a.flag^b.flag;
    int len=a.len+b.len;
    for(int i=1;i<=a.len;i++){
        int x=0;
        for(int j=1;j<=b.len;j++){
            ans.num[i+j-1]+=(a.num[i]*b.num[j]+x);
            x=ans.num[i+j-1]/10;
            ans.num[i+j-1]%=10;
        }
        ans.num[i+b.len]+=x;
    }
    while(!ans.num[len] && len>1)len--;
    ans.len=len;
    return ans;
}
bign operator /(bign a,int b){
    bign ans;
    ans.flag=a.flag^(b<0);
    b=b<0?-b:b;
    int len=a.len;
    for(int i=len,x=0;i>=1;i--){
        x=x*10+a.num[i];
        ans.num[i]=x/b;
        x%=b;
    }
    while(!ans.num[len]&&len>1) len--;
    ans.len=len;
    return ans;
}

int main(){
    A.read();B.read();
    B.write();
}

經過總計超過24小時的調試和發瘋,請放心食用

總結

以上是生活随笔為你收集整理的高精 by jzzcjb的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。