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
更新了一下,但是符号优先级好像很奇怪
bigintA=100;
bigintA;
A=100;
(此代码已废)
#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() 只能只能赋一个很小的值(赋值语句太麻烦了-_-||)