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 }
  • 相关阅读:
    js的基本数据类型有哪些?
    页面优化的方式有哪些?
    为什么要用rem
    sass开发过程中遇到的几个坑
    js事件监听
    js数组去重的方法
    什么是怪异盒模型
    Cookie SameSite属性介绍及其在ASP.NET项目中的应用
    HttpServlet在第一个Servlet程序中的知识点
    Myeclipse 2017 创建第一个servlet步骤
  • 原文地址:https://www.cnblogs.com/InWILL/p/5847406.html
Copyright © 2011-2022 走看看