zoukankan      html  css  js  c++  java
  • 高精度类模板

    高精度除法速度太慢了,还仍需优化

      1 #include<iostream>
      2 #include<vector>
      3 #include<cmath>
      4 #include<string>
      5 #include<iomanip>
      6 #include<algorithm>
      7 using namespace std;
      8 
      9 #define MAXN 10000
     10 #define DLEN 4
     11 
     12 class BigNum
     13 {
     14 private:
     15     vector<int> A;
     16     bool FLAG;
     17     char cmp(const BigNum &,bool)const;
     18     void TRIM(){while(!A.empty()&&!A.back())A.pop_back();if(A.empty())FLAG=0;}
     19 public:
     20     BigNum(){FLAG=0;}
     21     BigNum(long long);
     22     void swap(BigNum &T){std::swap(FLAG,T.FLAG);A.swap(T.A);}
     23     void operator=(const BigNum &T){FLAG=T.FLAG;A=T.A;}
     24     void operator=(const string &);
     25     friend istream& operator>>(istream &,BigNum &);
     26     friend ostream& operator<<(ostream &,BigNum);
     27     bool   operator>(const BigNum &T){return this->cmp(T,0)>0;}
     28     bool   operator<(const BigNum &T){return this->cmp(T,0)<0;}
     29     BigNum operator-()const{BigNum T=*this;T.FLAG=~FLAG;return T;}
     30     BigNum abs()const{BigNum T=*this;T.FLAG=0;return T;}
     31     BigNum operator+(const BigNum &) const;
     32     BigNum operator-(const BigNum &) const;
     33     BigNum operator*(const BigNum &) const;
     34     BigNum operator/(const BigNum &)const;
     35     void operator+=(const BigNum &v){*this=*this+v;}
     36     void operator-=(const BigNum &v){*this=*this-v;}
     37     void operator*=(const BigNum &v){*this=*this*v;}
     38     void operator/=(const BigNum &v){*this=*this/v;}
     39     BigNum operator+(const long long a) const{return *this+BigNum(a);}
     40     BigNum operator-(const long long a) const{return *this-BigNum(a);}
     41     BigNum operator*(const long long a) const{return *this*BigNum(a);}
     42     BigNum operator/(const long long a) const{return *this/BigNum(a);}
     43 };
     44 
     45 char BigNum::cmp(const BigNum &a,bool flag)const
     46 {
     47     if(flag==0)
     48     {
     49         if(FLAG<a.FLAG) return 1;
     50         if(FLAG>a.FLAG) return -1;
     51     }
     52     char F=!FLAG||flag?1:-1;
     53     if(A.size()>a.A.size()) return F;
     54     if(A.size()<a.A.size()) return -F;
     55     for(int i=max(A.size(),a.A.size())-1;i>=0;i--)
     56     {
     57         if(A[i]>a.A[i]) return F;
     58         if(A[i]<a.A[i]) return -F;
     59     }
     60     return 0;
     61 }
     62 
     63 BigNum::BigNum(long long a)
     64 {
     65     FLAG=0;
     66     if(a<0) FLAG=1,a=-a;
     67     for(;a;a/=MAXN)
     68         A.push_back(a-(a/MAXN)*MAXN);
     69 }
     70 
     71 void BigNum::operator=(const string &s)
     72 {
     73     int len=0,n=0,m=0;
     74     if(s[0]=='-') FLAG=1,len=1;
     75     for(int i=s.size()-1;i>=len;i--)
     76     {
     77         if(m==DLEN) A.push_back(n),m=0,n=0;
     78         n+=(s[i]-'0')*pow(10,m);
     79         m++;
     80     }
     81     if(n>0)A.push_back(n);
     82 }
     83 
     84 istream& operator>>(istream &in,BigNum &T)
     85 {
     86     string s;
     87     in>>s;
     88     T=s;
     89     return in;
     90 }
     91 
     92 ostream& operator<<(ostream &out,BigNum T)
     93 {
     94     if(T.FLAG) out<<'-';
     95     out<<T.A[T.A.size()-1];
     96     for(int i=T.A.size()-2;i>=0;i--)
     97     {
     98         out.width(DLEN);
     99         out.fill('0');    
    100         out<<T.A[i];
    101     }
    102     return out;
    103 }
    104 
    105 BigNum BigNum::operator+(const BigNum &T) const
    106 {
    107     if(FLAG==T.FLAG)
    108     {
    109         BigNum t(*this);
    110         int j=max(A.size(),T.A.size());
    111         for(int i=0,is=0;i<j||is;i++)
    112         {
    113             if(i==t.A.size()) t.A.push_back(0);
    114             t.A[i]+=is+(i<T.A.size()?T.A[i]:0);
    115             is=t.A[i]>=MAXN;
    116             if(is)t.A[i]-=MAXN;
    117         }
    118         return t;
    119     }else return *this-(-T);
    120 }
    121 
    122 BigNum BigNum::operator-(const BigNum &T) const
    123 {
    124     if(FLAG==T.FLAG)
    125     {
    126         if(~cmp(T,1))
    127         {
    128             BigNum t(*this);
    129             for(int i=0,is=0;i<T.A.size()||is;i++)
    130             {
    131                 t.A[i]-=is+(i<T.A.size()?T.A[i]:0);
    132                 is=t.A[i]<0;
    133                 if(is) t.A[i]+=MAXN;
    134             }
    135             t.TRIM();
    136             return t;
    137         }else return -(T-*this);
    138     }else return *this+(-T);
    139 }
    140 
    141 BigNum BigNum::operator*(const BigNum &T) const
    142 {
    143     BigNum t;
    144     t.A.resize(A.size()+T.A.size());
    145     for(int i=0;i<A.size();i++)
    146         for(int j=0;j<T.A.size();j++)
    147         {
    148             t.A[i+j]+=A[i]*T.A[j];
    149             if(t.A[i+j]>=MAXN)
    150             {
    151                 t.A[i+j+1]+=t.A[i+j]/MAXN;
    152                 t.A[i+j]-=(t.A[i+j]/MAXN)*MAXN;
    153             }
    154         }
    155     t.TRIM();
    156     t.FLAG=FLAG*T.FLAG;
    157     return t;
    158 }
    159 
    160 BigNum BigNum::operator/(const BigNum &T)const
    161 {
    162     switch(this->cmp(T,1))
    163     {
    164         case -1:
    165             return 0;
    166         case 0:
    167             return 1;
    168         case 1:
    169             BigNum a(*this),b,c,d;
    170             long long n=this->A.size()-T.A.size();
    171             for(int i=n;i>=0;i--)
    172             {
    173                 c=pow(10,i);
    174                 b=T*c;
    175                 while((a-b).FLAG==0)
    176                 {
    177                     a=a-b;
    178                     d+=c;
    179                 }
    180             }
    181             return d;
    182     }
    183     return -1;
    184 }
  • 相关阅读:
    centos7.6 使用yum安装mysql5.7
    解决hadoop本地库问题
    docker-compose 启动警告
    docker 安装zabbix5.0 界面乱码问题解决
    docker 部署zabbix问题
    zookeeper 超时问题
    hbase regionserver异常宕机
    (转载)hadoop 滚动升级
    hadoop Requested data length 86483783 is longer than maximum configured RPC length
    zkfc 异常退出问题,报错Received stat error from Zookeeper. code:CONNECTIONLOSS
  • 原文地址:https://www.cnblogs.com/InWILL/p/5847406.html
Copyright © 2011-2022 走看看