#include<bits/stdc++.h>
#define ns "-1"
#define fs(i,x,y,z) for(ll i=x;i<=y;i+=z)
#define ft(i,x,y,z) for(ll i=x;i>=y;i+=z)
#define ll long long
#define ull unsigned long long
#define db double
#define ms(a,b) memset(a,b,sizeof(a))
#define sz(a) sizeof(a)
using namespace std;
const int rw[]={-1,0,1,0,-1,1,-1,1},cl[]={0,1,0,-1,-1,1,1,-1};
const int N=10001,inf=0x3f3f3f3f;
struct number{
int len,num[N];
bool isfu;
number & operator = (const char*);
number & operator = (int);
number();
number(int);
bool operator > (const number &) const;
bool operator < (const number &) const;
bool operator >= (const number &) const;
bool operator <= (const number &) const;
bool operator != (const number &) const;
bool operator == (const number &) const;
number operator + (const number &) const;
number operator - (const number &) const;
number operator * (const number &) const;
number operator / (const number &) const;
number operator % (const number &) const;
number operator += (const number &);
number operator -= (const number &);
number operator *= (const number &);
number operator /= ( number &);
number operator %= ( number &);
number operator ++ ();
number operator -- ();
};
void deletezero(number &p){
while(p.num[p.len]==0&&p.len>1) p.len--;
if(p.len==1&&p.num[1]==0&&p.isfu) p.isfu=0;
}
number abs(number p){
number k=p;
k.isfu=0;
return k;
}
number & number::operator = (const char* c){
ms(num,0);
int n=strlen(c),j=1,k=1;
if(c[0]=='-'){
isfu=1;
fs(i,2,n,1){
if(k>=10000){
j++;
k=1;
}
num[j]+=k*(c[n-i+1]-'0');
k*=10;
}
len=j;
deletezero(*this);
return *this;
}
fs(i,1,n,1){
if(k>=10000){
j++;
k=1;
}
num[j]+=k*(c[n-i]-'0');
k*=10;
}
len=j;
deletezero(*this);
return *this;
}
number & number::operator = (int p){
char s[N];
sprintf(s,"%d",p);
return *this=s;
}
number::number(){
ms(num,0);
len=1;
isfu=0;
}
number::number(int p){
*this=p;
}
bool number::operator > (const number &b) const{
if(isfu&&b.isfu==0) return 0;
if(isfu==0&&b.isfu) return 1;
bool w=!isfu;
if(len!=b.len) return (len>b.len)*w;
ft(i,len,1,-1){
if(num[i]!=b.num[i]) return (num[i]>b.num[i])*w;
}
return 0;
}
bool number::operator < (const number &b) const{
return b>*this;
}
bool number::operator <= (const number &b) const{
return !(*this>b);
}
bool number::operator >= (const number &b) const{
return !(b>*this);
}
bool number::operator != (const number &b) const{
return (b>*this)||(*this>b);
}
bool number::operator == (const number &b) const{
return !(*this>b)&&!(b>*this);
}
ostream & operator << (ostream &o,number p){
if(p.isfu) o<<'-';
o<<p.num[p.len];
ft(i,p.len-1,1,-1){
o.width(4);
o.fill('0');
o<<p.num[i];
}
return o;
}
istream & operator >> (istream &x,number &p){
char s[N];
x>>s;
p=s;
return x;
}
number number::operator + (const number &b) const{
number c,a=*this;
if(isfu&&b.isfu==0){
//if(b<abs(a)){
number k=abs(a);
if(b>=k) c=b-k;
else c=k-b;
if(b<abs(a)) c.isfu=1;
deletezero(c);
return c;
//}
}else if(isfu==0&&b.isfu){
//if(a<abs(b)){
number k=abs(b);
if(a>=k) c=a-k;
else c=k-a;
if(a<abs(b)) c.isfu=1;
deletezero(c);
return c;
//}
}
c.len=max(len,b.len);
fs(i,1,c.len,1){
c.num[i]+=num[i]+b.num[i];
if(c.num[i]>=10000){
c.num[i]-=10000;
c.num[i+1]++;
}
}
if(c.num[c.len+1]>0) c.len++;
deletezero(c);
c.isfu=isfu;
return c;
}
number number::operator - (const number &b) const{
number c,a=*this;
if(isfu==0&&b.isfu==0&&a<b){
c=b-a;
c.isfu=1;
return c;
}else if(isfu&&b.isfu==0){
number k=abs(a);
c=k+b;
c.isfu=1;
return c;
}else if(isfu==0&&b.isfu){
return a+abs(b);
}else if(isfu&&b.isfu){
c=abs(b)-abs(a);
//c.isfu=1;
return c;
}
c.len=len;
fs(i,1,c.len,1){
c.num[i]+=num[i]-b.num[i];
if(c.num[i]<0){
c.num[i]+=10000;
c.num[i+1]--;
}
}
deletezero(c);
return c;
}
number number::operator += (const number &b) {
return *this=*this+b;
}
number number::operator -= (const number &b) {
return *this=*this-b;
}
number number::operator ++ () {
return *this=*this+1;
}
number number::operator -- () {
return *this=*this-1;
}
number number::operator * (const number &b) const{
number c;
if((isfu&&b.isfu==0)||(isfu==0&&b.isfu)) c.isfu=1;
else c.isfu=0;
c.len=len+b.len+1;
fs(i,1,len,1){
fs(j,1,b.len,1){
c.num[i+j-1]+=num[i]*b.num[j];
c.num[i+j]+=c.num[i+j-1]/10000;
c.num[i+j-1]%=10000;
}
}
deletezero(c);
return c;
}
number number::operator *= (const number &b) {
return *this=(*this)*b;
}
number number::operator / (const number &b) const{
number c,d;
if((isfu&&b.isfu==0)||(isfu==0&&b.isfu)) c.isfu=1;
else c.isfu=0;
c.len=len+b.len+1;d.len=0;
ft(i,len,1,-1){
memmove(d.num+2,d.num+1,sz(d.num)-sz(int)*2);
d.len++;
d.num[1]=num[i];
int l=0,r=9999,m;
while(l<r){
m=(l+r)/2;
if((b*number(m))<=d) l=m+1;
else r=m;
}
c.num[i]=r-1;
d=d-b*number(r-1);
}
deletezero(c);
return c;
}
number number::operator /= ( number &b) {
return *this=(*this)/b;
}
number number::operator % (const number &b) const{
if(*this<b) return *this;
number c,d;if((isfu&&b.isfu==0)||(isfu==0&&b.isfu)) c.isfu=1;
else c.isfu=0;
d.isfu=isfu;
c.len=len+b.len+1;d.len=0;
ft(i,len,1,-1){
memmove(d.num+2,d.num+1,sz(d.num)-sz(int)*2);
d.len++;
d.num[1]=num[i];
int l=0,r=9999,m;
while(l<r){
m=(l+r)/2;
if((b*number(m))<=d) l=m+1;
else r=m;
}
c.num[i]=r-1;
d=d-b*number(r-1);
}
deletezero(c);
return d;
}
number number::operator %= ( number &b) {
return *this=(*this)%b;
}
number a,b;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>a>>b;
cout<<a+b<<'\n'<<a-b<<'\n'<<a*b<<'\n'<<a/b<<'\n'<<a%b;
return 0;
}
C++高精度完整版
发布于
2020-07-21
|
8分钟
|
1250字数
0%
召唤伊斯特瓦尔