模板:高精度

来源:互联网 发布:营业收入印花税的算法 编辑:程序博客网 时间:2024/06/03 19:57

终于打完了我的辣鸡200行代码

类名:int1024

成员变量:char arr[] , int len , neg ( 1 表示正数 , -1 表示负数 )

函数全部是operator尴尬

/*Name: high_precision.cppCopyright: 大家勉强用用吧 Author: ureasterDate: 20/10/17 22:32Description: 慢到爆炸的高精度模板 */#include<stdio.h>      #include<string.h>      #include<algorithm>      #include<stdlib.h>  #include<time.h>  using namespace std;      const int N=1024;      struct int1024 {          char arr[N];          int len,neg;          int1024():len(0),neg(1) {              memset(arr,0,sizeof arr);          }          int1024(int n2) {          memset(arr,0,sizeof arr);          if(n2>0) neg=1;          else {              neg=-1;              n2=-n2;          }          len=0;          while(n2) {              arr[len++]=n2%10;              n2/=10;          }          if(!len) len=1;      }      void read() {              scanf("%s",arr);              len=strlen(arr);              if(arr[0]=='-') {                  neg=-1;                  memcpy(arr,arr+1,sizeof arr);                  len--;              }              for(int i=0;i<len;i++) arr[i]-='0';              for(int i=0;i<len/2;i++) swap(arr[i],arr[len-i-1]);      }          void print() {              if(neg==-1) putchar('-');              for(int i=len-1;i>=0;i--) {                  printf("%d",arr[i]);              }          }                int1024 operator=(int n2) {          memset(arr,0,sizeof arr);          if(n2>0) neg=1;          else {              neg=-1;              n2=-n2;          }          len=0;          while(n2) {              arr[len++]=n2%10;              n2/=10;          }          if(!len) len=1;          return *this;      }            friend bool operator==(const int1024 n1,const int1024 n2) {              if(n1.len==1&&n2.len==1&&n1.arr[0]==0&&n2.arr[0]==0) return 1;              if(n1.neg==n2.neg&&n1.len==n2.len) {                  for(int i=0;i<n1.len;i++) {                      if(n1.arr[i]!=n2.arr[i])                          return 0;                  }                  return 1;              }              return 0;          }              friend bool operator<(const int1024 n1,const int1024 n2) {              if(n1.neg+n2.neg==0) {                  if(n1.neg==-1) return 1;                  return 0;              }              if(n1.neg==-1) return -n1>-n2;            if(n1.len<n2.len) return 1;            if(n1.len>n2.len) return 0;            for(int i=n1.len-1;i>=0;i--) {                if(n1.arr[i]<n2.arr[i]) return 1;                if(n1.arr[i]>n2.arr[i]) return 0;            }            return 0;        }          friend bool operator>(const int1024 n1,const int1024 n2) {              if(n1.neg+n2.neg==0) {                  if(n1.neg==-1) return 0;                  return 1;              }              if(n1.neg==-1) return -n1<-n2;            if(n1.len<n2.len) return 0;            if(n1.len>n2.len) return 1;            for(int i=n1.len-1;i>=0;i--) {                if(n1.arr[i]<n2.arr[i]) return 0;                if(n1.arr[i]>n2.arr[i]) return 1;            }            return 0;        }                  friend bool operator<=(const int1024 n1,const int1024 n2) {            return !(n1>n2);        }        friend bool operator>=(const int1024 n1,const int1024 n2) {            return !(n1<n2);        }        friend bool operator!=(const int1024 n1,const int1024 n2) {            return !(n1==n2);        }         friend int1024 operator-(const int1024 n1) {              int1024 r=n1;              r.neg=-r.neg;              return r;        }                  friend int1024 operator+(const int1024 n1,const int1024 n2) {            if(n1.neg+n2.neg==0) return n1-(-n2);              int1024 r;              if(n1.neg+n2.neg==-2) r.neg=-1;              r.len=max(n1.len,n2.len)+1;             for(int i=0;i<r.len;i++) {                  r.arr[i]+=n1.arr[i]+n2.arr[i];                  r.arr[i+1]=r.arr[i]/10;                  r.arr[i]%=10;              }              while(r.len>1&&r.arr[r.len-1]==0) r.len--;          return r;          }          friend int1024 operator-(int1024 n1,int1024 n2) {            if(n1.neg+n2.neg==0) return n1+(-n2);          int1024 r;            if(n1.neg+n1.neg==-2) {          r.neg=-1; n1.neg=1; n2.neg=1;        }            if(n1<n2) {          swap(n1,n2); r.neg=-r.neg;        }        r.len=max(n1.len,n2.len)+1;            if(n1<n2) return n2-n1;          for(int i=0;i<r.len;i++) {                r.arr[i]+=n1.arr[i]-n2.arr[i];                int tmp=(r.arr[i]%10+10)%10;                r.arr[i+1]+=(r.arr[i]-tmp)/10;                r.arr[i]=tmp;          }            while(r.len>1&&r.arr[r.len-1]==0) r.len--;        return r;        }                friend int1024& operator+=(int1024 &n1,int1024 n2) {          n1=n1+n2;          return n1;      }          friend int1024& operator-=(int1024 &n1,int1024 n2) {          n1=n1-n2;          return n1;      }      friend int1024& operator*=(int1024 &n1,int1024 n2) {          n1=n1*n2;          return n1;      }      friend int1024& operator/=(int1024 &n1,int1024 n2) {    n1=n1/n2;    return n1;}    friend int1024 operator*(const int1024 n1,const int1024 n2) {          int1024 r;          r.neg=n1.neg*n2.neg;          r.len=n1.len+n2.len;          for(int i=0;i<n1.len;i++) {              for(int j=0;j<n2.len;j++) {                  r.arr[i+j+1]+=r.arr[i+j]/10;                  r.arr[i+j]%=10;                  r.arr[i+j]+=n1.arr[i]*n2.arr[j];              }          }          for(int i=0;i<r.len;i++) {              r.arr[i+1]+=r.arr[i]/10;              r.arr[i]%=10;          }          while(r.len>1&&r.arr[r.len-1]==0) r.len--;          return r;      }            friend int1024 operator/(int1024 n1,int1024 n2) {          int1024 r,rem;          if(n2.len==1&&n2.arr[0]==0) {              printf("\n___________________\nUNABLE : DEVIDED BY 0\n___________________\n");               return r;          }          int ng=1;        if(n1.neg+n2.neg==0) {              ng=-1;          }          n1.neg=n2.neg=1;                    int p=n1.len-1;          while(p>=0) {              rem=rem*10+n1.arr[p--];              r*=10;              while(rem>=n2) {                  rem-=n2,r+=1;              }          }          while(r.len>1&&r.arr[r.len-1]==0) r.len--;          r.neg=ng;        return r;      }      friend int1024 operator%(int1024 n1,int1024 n2) {          int1024 rem;          if(n2.len==1&&n2.arr[0]==0) {              printf("\n___________________\nUNABLE : DEVIDED BY 0\n___________________\n");         }          int ng=n1.neg;        n1.neg=n2.neg=1;                    int p=n1.len-1;          while(p>=0) {              rem=rem*10+n1.arr[p--];              while(rem>=n2) {                  rem-=n2;              }          }          rem.neg=ng;        return rem;      }  };            //test areaint main() {          int1024 i1,i2,i3;      i1.read();      i2.read();      i3=i1*i2;      i3.print();             }      


原创粉丝点击