终于打完了我的辣鸡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();
}