zoukankan      html  css  js  c++  java
  • 超 短 高精度 bign 模板

    终于会了,233

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    struct bign
    {
        int len;
        int num[1501];
        bool flag;
        bign(){len=1;flag=0;memset(num,0,sizeof num);}
        bign(int x)
        {
            if(!x)return;
            len=0;
            while(x)
            {
                num[++len]=x%10;x/=10;
            }
        }
    };
    bool operator < (bign a,bign b){
        if(a.len<b.len)return 1;
        if(a.len>b.len)return 0;
        for(int i=a.len;i>=1;i--)if(a.num[i]>b.num[i])return 0;
        return 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 operator + (bign a,bign b){
        bign ans;
        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;
        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,bign b){
        bign ans;
        if(a==b)return ans;
        if(b<a){
            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]--;//向a的高位借位
                }
            }
        }
        else{
            ans.flag=1;// this number(I mean the ans) is smaller than zero
            for(int i=1;i<=b.len;i++){
                if(b.num[i]<0){
                    b.num[i]+=10; b.num[i+1]--;
                }
                ans.num[i]=b.num[i]-a.num[i];
                if(ans.num[i]<0){
                    ans.num[i]+=10; b.num[i+1]--;
                }
            }
        }
        int len=max(a.len,b.len);
        while(ans.num[len]<=0 && len>1)len--;
        ans.len=len;
        return ans;
    }
    bign get()
    {
        bign ans;
        string s;
        cin>>s;
        int l=s.length();
        ans.len=l;
        if(s[0]=='-')
        {
            ans.flag=1;
            for(int i=1;i<ans.len;i++)ans.num[ans.len-i]=s[i]-48;
        }
        else
        {
            for(int i=0;i<ans.len;i++)ans.num[ans.len-i]=s[i]-48;
        }
        return ans;
    }
    void out(bign x)
    {
        if(x.flag)
        {
            cout<<"-";
            for(int i=x.len-1;i>=1;i--)
            {
                cout<<x.num[i];
            }
        }
        else
        for(int i=x.len;i>=1;i--)
        {
            cout<<x.num[i];
        }
    }
    int main()
    {
        bign x=get();
        out(x);
        return 0;
    }
  • 相关阅读:
    深入Log4J源码之Log4J Core
    ScheduledThreadPoolExecutor与System#nanoTime
    []JSR 133 (Java Memory Model) FAQ
    happens-before俗解
    ScheduledThreadPoolExecutor实现原理
    Java Timer&TimerTask原理分析
    Java 编程的动态性,第 1 部分: 类和类装入
    结合反射与 XML 实现 Java 编程的动态性
    Java 日志缓存机制的实现
    Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析
  • 原文地址:https://www.cnblogs.com/Skyvot/p/4072036.html
Copyright © 2011-2022 走看看