模板:高精度

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

类名:int1024

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

函数全部是operator尴尬

/*
	Name: high_precision.cpp
	Copyright: 大家勉强用用吧 
	Author: ureaster
	Date: 20/10/17 22:32
	Description: 慢到爆炸的高精度模板 
*/
#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 area
int main() {      
    int1024 i1,i2,i3;  
    i1.read();  
    i2.read();  
    i3=i1*i2;  
    i3.print();  
     
      
}      


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值