高精度模板
来源:互联网 发布:js设置div滚动条位置 编辑:程序博客网 时间:2024/05/17 02:32
2016-9-28
由于某些不可抗力,2016-9-25的代码是废的(有很多地方写错了)
于是我又写了一个新的.
#include <iostream>#include <iomanip>#include <cstring>using namespace std;class bigint { int sz; int len,num[1000]; public: bigint() { sz=10000; memset(num,0,sizeof(num)); len=0; } long long operator = (const long long &tmp) { long long val; val=tmp; len=0; memset(num,0,sizeof(num)); while (val) { num[len]=val%sz; len++; val/=sz; } return tmp; } template <class T1,class T2> friend bigint operator + (const T1 &A,const T2 &B); template <class T> friend bigint operator += (bigint &A,const T &B); template <class T1,class T2> friend bigint operator * (const T1 &A,const T2 &B); template <class T> friend bigint operator *= (bigint &A,const T &B); template <class T1,class T2> friend bool operator < (const T1 &A,const T2 &B); template <class T1,class T2> friend bool operator > (const T1 &A,const T2 &B); template <class T1,class T2> friend bool operator <= (const T1 &A,const T2 &B); template <class T1,class T2> friend bool operator >= (const T1 &A,const T2 &B); template <class T1,class T2> friend bool operator == (const T1 &A,const T2 &B); template <class T1,class T2> friend bool operator != (const T1 &A,const T2 &B); friend istream &operator >> (istream &in,bigint &tmp); friend ostream &operator << (ostream &out,const bigint &tmp);};template <class T1,class T2> bigint operator + (const T1 &t1,const T2 &t2) { bigint A,B; A=t1,B=t2; bigint ans; ans.len=max(A.len,B.len); for(int i=0;i<ans.len;i++){ ans.num[i]+=A.num[i]+B.num[i]; if(ans.num[i]>=ans.sz){ ans.num[i]-=ans.sz; ans.num[i+1]++; } } if(ans.num[ans.len]>0)ans.len++; return ans;}template <class T> bigint operator += (bigint &A,const T &B) { A=A+B; return A;}template <class T1,class T2> bigint operator * (const T1 &t1,const T2 &t2) { bigint A,B; A=t1,B=t2; bigint ans; for(int i=0;i<A.len;i++){ for(int j=0;j<B.len;j++){ ans.num[i+j]+=A.num[i]*B.num[j]; ans.num[i+j+1]+=ans.num[i+j]/ans.sz; ans.num[i+j]%=ans.sz; } } ans.len=A.len+B.len-1; if(ans.num[ans.len]>0)ans.len++; while(ans.len>=2&&ans.num[ans.len-1]==0)ans.len--; return ans;}template <class T> bigint operator *= (bigint &A,const T &B) { A=A*B; return A;}template <class T1,class T2> bool operator < (const T1 &t1,const T2 &t2) { bigint A,B; A=t1,B=t2; if (A.len<B.len) return 1; else if (A.len>B.len) return 0; for (int i=0;i<A.len;++i) { if (A.num[i]<B.num[i]) return 1; else if (A.num[i]>B.num[i]) return 0; } return 0;}template <class T1,class T2> bool operator > (const T1 &t1,const T2 &t2) { bigint A,B; A=t1,B=t2; if (A.len<B.len) return 0; else if (A.len>B.len) return 1; for (int i=0;i<A.len;++i) { if (A.num[i]<B.num[i]) return 0; else if (A.num[i]>B.num[i]) return 1; } return 0;}template <class T1,class T2> bool operator == (const T1 &t1,const T2 &t2) { bigint A,B; A=t1,B=t2; if (A.len!=B.len) return 0; for (int i=0;i<A.len;++i) if (A.num[i]!=B.num[i]) return 0; return 1;}template <class T1,class T2> bool operator != (const T1 &t1,const T2 &t2) { bigint A,B; A=t1,B=t2; if (A.len!=B.len) return 1; for (int i=0;i<A.len;++i) if (A.num[i]!=B.num[i]) return 1; return 0;}template <class T1,class T2> bool operator <= (const T1 &A,const T2 &B) { return A==B||A<B;}template <class T1,class T2> bool operator >= (const T1 &A,const T2 &B) { return A==B||A>B;}istream &operator >> (istream &in,bigint &tmp) { string str; in>>str; int l=str.length(); tmp.len=0; memset(tmp.num,0,sizeof(tmp.num)); for(int i=l-1;i>=0;i-=4){ int p=0; for(int j=max(0,i-3);j<=i;j++) p=p*10+(str[j]^48); tmp.num[tmp.len++]=p; } return in;}ostream &operator << (ostream &out,const bigint &tmp) { out<<tmp.num[tmp.len-1]; for (int i=tmp.len-2;i>=0;i--) { out<<setfill('0')<<setw(4)<<tmp.num[i]; } return out;}
2016-9-25
更新了一下,但是符号优先级好像很奇怪
(此代码已废)
#include <iostream>#include <iomanip>#include <cstring>using namespace std;struct bigint { int sz; int len,num[1000]; bigint(int key=10000) { sz=key; len=0; memset(num,0,sizeof(num)); } long long operator = (const long long &tmp) { int val; val=tmp; len=0; memset(num,0,sizeof(num)); while (val) { num[len]=val%sz; len++; val/=sz; } return tmp; } friend istream &operator >> (istream &in,bigint &tmp); friend ostream &operator << (ostream &out,const bigint &tmp);};template <class T> bigint operator + (const bigint &x,const T &t) { bigint tmp; tmp=t; bigint ans; ans.len=max(x.len,tmp.len); for(int i=0;i<ans.len;i++){ ans.num[i]+=x.num[i]+tmp.num[i]; if(ans.num[i]>=ans.sz){ ans.num[i]-=ans.sz; ans.num[i+1]++; } } if(ans.num[ans.len]>0)ans.len++; return ans;}template <class T> bigint operator + (const T &t,const bigint &x) { return x+t;}template <class T> bigint operator * (const bigint &x,const T &t) { bigint tmp; tmp=t; bigint ans; for(int i=0;i<x.len;i++){ for(int j=0;j<tmp.len;j++){ ans.num[i+j]+=x.num[i]*tmp.num[j]; ans.num[i+j+1]+=ans.num[i+j]/ans.sz; ans.num[i+j]%=ans.sz; } } ans.len=x.len+tmp.len-1; if(ans.num[ans.len]>0)ans.len++; while(ans.len>=2&&ans.num[ans.len-1]==0)ans.len--; return ans;}template <class T> bigint operator * (const T &t,const bigint &x) { return x*t;}template <class T> bool operator == (const bigint &x,const T &t) { bigint tmp; tmp=t; if (x.len!=tmp.len) return 0; for (int i=0;i<x.len;++i) if (x.num[i]!=tmp.num[i]) return 0; return 1;}template <class T> bool operator == (const T &t,const bigint &x) { return x==t;}template <class T> bool operator != (const bigint &x,const T &t) { bigint tmp; tmp=t; if (x.len!=tmp.len) return 1; for (int i=0;i<x.len;++i) if (x.num[i]!=tmp.num[i]) return 1; return 0;}template <class T> bool operator != (const T &t,const bigint &x) { return x!=t;}template <class T> bool operator < (const bigint &x,const T &t) { bigint tmp; tmp=t; if (x.len<tmp.len) return 1; else if (x.len>tmp.len) return 0; for (int i=0;i<x.len;++i) { if (x.num[i]<tmp.num[i]) return 1; else if (x.num[i]>tmp.num[i]) return 0; } return 0;}template <class T> bool operator > (const bigint &x,const T &t) { bigint tmp; tmp=t; if (x.len<tmp.len) return 0; else if (x.len>tmp.len) return 1; for (int i=0;i<x.len;++i) { if (x.num[i]<tmp.num[i]) return 0; else if (x.num[i]>tmp.num[i]) return 1; } return 0;}template <class T> bool operator < (const T &t,const bigint &x) { return x>t;}template <class T> bool operator > (const T &t,const bigint &x) { return x<t;}istream &operator >> (istream &in,bigint &tmp) { string str; in>>str; int l=str.length(); tmp.len=0; memset(tmp.num,0,sizeof(tmp.num)); for(int i=l-1;i>=0;i-=4){ int p=0; for(int j=max(0,i-3);j<=i;j++) p=p*10+(str[j]^48); tmp.num[tmp.len++]=p; } return in;}ostream &operator << (ostream &out,const bigint &tmp) { out<<tmp.num[tmp.len-1]; for (int i=tmp.len-2;i>=0;i--) { out<<setfill('0')<<setw(4)<<tmp.num[i]; } return out;}
2016-7-12
仅仅只是高精度模板 -_-||
struct BigInt { int num[100]; int len; BigInt() { memset(num,0,sizeof(num)); } void get(int x) { memset(num,0,sizeof(num)); num[0]=x; len=1; } void Rd() { char str[400]; scanf("%s",str); int l=strlen(str); len=0; for(int i=l-1; i>=0; i-=4) { int p=0; for(int j=max(0,i-3); j<=i; j++) p=p*10+(str[j]-'0'); num[len++]=p; } } void Print() { printf("%d",num[len-1]); for(int i=len-2; i>=0; i--) printf("%04d",num[i]); puts(""); } BigInt operator +(const BigInt & tmp)const { BigInt C; C.len=max(len,tmp.len); for(int i=0; i<C.len; i++) { C.num[i]+=num[i]+tmp.num[i]; if(C.num[i]>=10000) { C.num[i+1]+=1; C.num[i]-=10000; } } if(C.num[C.len]>0)C.len++; return C; } BigInt operator * (const BigInt &tmp)const { BigInt C; for(int i=0; i<len; i++) for(int j=0; j<tmp.len; j++) { C.num[i+j]+=num[i]*tmp.num[j]; if(C.num[i+j]>=10000) { C.num[i+j+1]+=C.num[i+j]/10000; C.num[i+j]%=10000; } } C.len=len+tmp.len-1; if(C.num[C.len]>0)C.len++; while(C.len>=2&C.num[C.len-1]==0)C.len--; return C; } bool operator < (const BigInt &tmp)const { if(len!=tmp.len)return len<tmp.len; for(int i=len-1; i>=0; i--) { if(num[i]!=tmp.num[i]) { return num[i]<tmp.num[i]; } } }};
注意 get() 只能只能赋一个很小的值(赋值语句太麻烦了-_-||)
2 0
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 【模板】高精度
- 高精度模板
- 高精度模板
- PHP5调用win系统com组件
- Fragment
- java基础学习篇之核心java
- 线程URL访问网络资源
- LeetCode 第 367 题 (Valid Perfect Square)
- 高精度模板
- SharedPreferences基本使用
- 浅谈 JS 对象添加 getter与 setter 的5种方法以及如何让对象属性不可配置或枚举
- QGraphicItem实现中心旋转
- Linux下*.tar.gz文件解压缩命令
- 【经典算法】:并查集详解
- 获取出生日期和时间
- iOS 【Third-SDWebImage基本使用】
- Android中应用程序如何获得系统签名权限,比如要自己控制android灭屏锁屏