题目背景
这个题目很新颖吧!!!
题目描述
求A、B的和差积商余!
由于数据有修改,减法运算结果可能带负号!
输入输出格式
输入格式:
两个数两行
A B
输出格式:
五个数
和 差 积 商 余
输入输出样例
说明
length(A),length(B)<=10^4
A,B>0
每个点3s。
/* 刚写完高精加减乘 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 20010 using namespace std; int a[maxn],b[maxn],c[maxn]; struct node{ int len,zu[maxn]; bool operator < (const node x)const{ if(len!=x.len)return len<x.len; for(int i=1;i<=len;i++) if(zu[i]!=x.zu[i])return zu[i]<x.zu[i]; } node operator + (const node x)const{ node res; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); int l=max(len,x.len); for(int i=1,j=len;i<=len;i++,j--)a[i]=zu[j]; for(int i=1,j=x.len;i<=x.len;i++,j--)b[i]=x.zu[j]; for(int i=1;i<=l;i++){ c[i]+=a[i]+b[i]; c[i+1]=c[i]/10; c[i]%=10; } while(c[l+1]){ l++; c[l+1]=c[l]/10; c[l]%=10; } for(int i=1,j=l;i<=l;i++,j--)res.zu[i]=c[j]; res.len=l; return res; } node operator - (const node x)const{ node res; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); int l=max(len,x.len); for(int i=1,j=len;i<=len;i++,j--)a[i]=zu[j]; for(int i=1,j=x.len;i<=x.len;i++,j--)b[i]=x.zu[j]; for(int i=1;i<=l;i++){ if(a[i]<b[i])a[i]+=10,a[i+1]-=1; c[i]+=a[i]-b[i]; } while(c[l]==0)l--; res.len=l; for(int i=1,j=l;i<=l;i++,j--){ res.zu[i]=c[j]; } return res; } node operator * (const node x)const{ node res; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); int l=len+x.len-1; for(int i=1,j=len;i<=len;i++,j--)a[i]=zu[j]; for(int i=1,j=x.len;i<=x.len;i++,j--)b[i]=x.zu[j]; for(int i=1;i<=len;i++) for(int j=1;j<=x.len;j++) c[i+j-1]+=a[i]*b[j]; for(int i=1;i<=l;i++){ c[i+1]+=c[i]/10; c[i]%=10; } while(c[l+1]){ l++; c[l+1]=c[l]/10; c[l]%=10; } while(c[l]==0&&l>0)l--; if(l==0)c[++l]=0; for(int i=1,j=l;i<=l;i++,j--)res.zu[i]=c[j]; res.len=l; return res; } }A,B; char chA[maxn],chB[maxn]; int main(){ freopen("Cola.txt","r",stdin); scanf("%s",chA+1); scanf("%s",chB+1); A.len=strlen(chA+1); B.len=strlen(chB+1); for(int i=1;i<=A.len;i++)A.zu[i]=chA[i]-'0'; for(int i=1;i<=B.len;i++)B.zu[i]=chB[i]-'0'; node he,cha,ji,shang,yu; bool flag=0; if(A<B)swap(A,B),flag=1; he=A+B; cha=A-B; ji=A*B; for(int i=1;i<=he.len;i++)cout<<he.zu[i];cout<<endl; if(flag)cout<<'-'; for(int i=1;i<=cha.len;i++)cout<<cha.zu[i];cout<<endl; for(int i=1;i<=ji.len;i++)cout<<ji.zu[i];cout<<endl; }