zoukankan      html  css  js  c++  java
  • [模板] 高精度运算

    使用vector作为基类,优点是空间动态分配,缺点是STL重度依赖,离开O2就很慢(除法未优化)

    #include<algorithm>
    #include<iostream>
    #include<cstdio>
    #include<vector>
    
    using namespace std;
    
    struct bign:vector<int>{
      bign(int n=0){
        push_back(n);
        check();
      }
      bign& check(){
        while(!empty()&&!back())pop_back();
        if(empty())return *this;
        for(unsigned int i=1;i<size();i++){
          (*this)[i]+=(*this)[i-1]/10;
          (*this)[i-1]%=10;
        }
        while(back()>=10){
          push_back(back()/10);
          (*this)[size()-2]%=10;
        }
        return *this;
      }
    };
    istream& operator>>(istream &is,bign &n){
      string s;is>>s;n.clear();
      for(int i=s.size()-1;i>=0;i--)n.push_back(s[i]-'0');
      return is;
    }
    ostream& operator<<(ostream &os,const bign &n){
      if(n.empty()) os<<0;
      for(int i=n.size()-1;i>=0;i--)os<<n[i];
      return os;
    }
    bool operator<(const bign &a,const bign &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 0;
    }
    bool operator>(const bign &a,const bign &b){return b<a;}
    bool operator<=(const bign &a,const bign &b){return !(a>b);}
    bool operator>=(const bign &a,const bign &b){return !(a<b);}
    bool operator==(const bign &a,const bign &b){return (a<=b)&&(b<=a);}
    bool operator!=(const bign &a,const bign &b){return !(a==b);}
    bign& operator+=(bign &a,const bign &b){
      if(a.size()<b.size())a.resize(b.size());
      for(unsigned int i=0;i!=b.size();i++)a[i]+=b[i];
      return a.check();
    }
    bign operator+(bign a,const bign &b){return a+=b;}
    bign& operator-=(bign &a,bign b){
      if(a<b) swap(a,b);
      for(unsigned int i=0;i!=b.size();a[i]-=b[i],i++){
        if(a[i]>=b[i])continue;
        int j=i+1;
        while(!a[j]) j++;
        while(j>i) --a[j],a[--j]+=10;
      }
      return a.check();
    }
    bign operator-(bign a,bign b){return a-=b;}//abs
    bign operator*(const bign &a,const bign &b){
      bign n;
      n.assign(a.size()+b.size()-1,0);
      for(unsigned int i=0;i!=a.size();i++)
        for(unsigned int j=0;j!=b.size();j++)
          n[i+j]+=a[i]*b[j];
      return n.check();
    }
    bign& operator*=(bign &a,bign &b){return a=a*b;}
    bign divmod(bign &a,const bign &b){
      bign ret,d,c;
      for(int t=a.size()-b.size();a>=b;--t){
        d.assign(t+1,0);d.back()=1;c=b*d;
        while(a>=c)a-=c,ret+=d;
      }
      return ret;
    }
    bign operator/(bign a,const bign &b){return divmod(a,b);}
    bign operator/=(bign &a,const bign &b){return a=a/b;}
    bign &operator%=(bign &a,const bign &b){divmod(a,b);return a;}
    bign operator%(bign a,const bign &b){return a%=b;}
    int main(){
      bign a,b;
      cin>>a>>b;
      cout<<a+b<<endl;
      if(a<b)cout<<"-";
      cout<<a-b<<endl;
      cout<<a*b<<endl;
      cout<<divmod(a,b)<<endl;
      cout<<a<<endl;
    }
    
  • 相关阅读:
    C#递归拷贝文件夹下文件以及文件夹
    C# 获取文件名、目录、后缀、无后缀文件名、扩展名
    C#递归得到特定文件夹下问件
    Are you seeing high number of busyio or busyworker threads in the timeout exception?
    减少查询中的资源使用
    SQL性能优化前期准备-清除缓存、开启IO统计
    Sql server 存储过程批量插入若干数据。
    python读取excel中单元格的内容返回的5种类型
    Python读取excel数据类型处理
    【转】 如何导入excel数据到数据库,并解决导入时间格式问题
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9893482.html
Copyright © 2011-2022 走看看