模板:高精度
来源:互联网 发布:营业收入印花税的算法 编辑:程序博客网 时间: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(); }
阅读全文
0 0
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 【模板】高精度
- 高精度模板
- 高精度模板
- python error
- 深度学习之基础模型-Inception-V3
- 示例:Android使用AIDL实现跨进程通讯(IPC)
- cross entropy的梯度
- Spring ORM+Hibernate?Out!换 Spring Data JPA 吧!
- 模板:高精度
- ubuntu16.04 循环登录解决办法
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 求子串
- 朴素的网格游戏
- 排序算法之简单选择排序
- 使用servlet完成用户登录(http,servlet生命周期和相关配置,路径编写)
- Itext生成PDF文件加密与加水印