Luogu1932 A+B A-B A*B A/B A%B Problem
阿新 • • 發佈:2020-08-17
https://www.luogu.com.cn/problem/P1932
高精度集合
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define b kz.a #define c kzkz.a #define d kzzf.a #define N 20005 using namespace std; int n,o; char orz[N]; long long kza; struct BigNumber { int a[N]; bool operator < (const BigNumber kz) const { if (a[0]!=b[0]) return a[0]<b[0]; for (int i=a[0];i>=1;i--) if (a[i]!=b[i]) return a[i]<b[i]; return false; } bool operator <= (const BigNumber kz) const { if (a[0]!=b[0]) return a[0]<b[0]; for (int i=a[0];i>=1;i--) if (a[i]!=b[i]) return a[i]<b[i]; return true; } bool operator > (const BigNumber kz) const { if (a[0]!=b[0]) return a[0]>b[0]; for (int i=a[0];i>=1;i--) if (a[i]!=b[i]) return a[i]>b[i]; return false; } bool operator >= (const BigNumber kz) const { if (a[0]!=b[0]) return a[0]>b[0]; for (int i=a[0];i>=1;i--) if (a[i]!=b[i]) return a[i]>b[i]; return true; } bool operator == (const BigNumber kz) const { if (a[0]!=b[0]) return false; for (int i=a[0];i>=1;i--) if (a[i]!=b[i]) return false; return true; } bool operator != (const BigNumber kz) const { if (a[0]!=b[0]) return true; for (int i=a[0];i>=1;i--) if (a[i]!=b[i]) return true; return false; } BigNumber operator + (BigNumber kz) { int ws=max(a[0],b[0]); int jw=0; for (int i=1;i<=ws;i++) { b[i]=b[i]+a[i]+jw; jw=b[i]/10; b[i]%=10; } while (jw) { ws++; b[ws]=jw%10; jw/=10; } b[0]=ws; return kz; } BigNumber operator - (BigNumber kz) { BigNumber kzkz; memcpy(c,a,(a[0]+1) << 2); int ws=max(c[0],b[0]); for (int i=1;i<=ws;i++) { if (i>b[0]) b[i]=c[i]; else b[i]=c[i]-b[i]; if (b[i]<0) { b[i]+=10; c[i+1]--; } } while (!b[ws] && ws>1) ws--; b[0]=ws; return kz; } BigNumber operator * (BigNumber kz) { int la=a[0],lb=b[0]; BigNumber kzkz; for (int i=0;i<=la+lb;i++) c[i]=0; for (int i=1;i<=la;i++) for (int j=1;j<=lb;j++) { c[i+j-1]+=a[i]*b[j]; c[i+j]+=c[i+j-1]/10; c[i+j-1]%=10; } if (c[la+lb]) c[0]=la+lb; else c[0]=la+lb-1; return kzkz; } BigNumber operator / (BigNumber kz) { BigNumber kzkz,kzzf; for (int i=0;i<=a[0];i++) c[i]=d[i]=0; d[0]=1; for (int i=a[0];i>=1;i--) { if (!(d[0]==1 && d[1]==0)) { for (int i=d[0];i>=1;i--) d[i+1]=d[i]; d[1]=a[i]; d[0]++; } else d[1]=a[i]; while (kzzf>=kz) { kzzf=kzzf-kz; c[i]++; } } c[0]=a[0]; while (!c[c[0]] && c[0]>1) c[0]--; return kzkz; } BigNumber operator % (BigNumber kz) { BigNumber kzzf; for (int i=0;i<=a[0];i++) d[i]=0; d[0]=1; for (int i=a[0];i>=1;i--) { if (!(d[0]==1 && d[1]==0)) { for (int i=d[0];i>=1;i--) d[i+1]=d[i]; d[1]=a[i]; d[0]++; } else d[1]=a[i]; while (kzzf>=kz) kzzf=kzzf-kz; } return kzzf; } void set0() { a[0]=1,a[1]=0; } void set1() { a[0]=1,a[1]=1; } void setINF() { a[0]=300,a[300]=9; } void read() { scanf("%s",orz); a[0]=strlen(orz); for (int i=0;i<a[0];i++) a[a[0]-i]=orz[i]-'0'; } }s,t,zero; void operator += (BigNumber &kz,BigNumber &hz) { kz=kz+hz; } void operator -= (BigNumber &kz,BigNumber &hz) { kz=kz-hz; } void operator *= (BigNumber &kz,BigNumber &hz) { kz=kz*hz; } void operator /= (BigNumber &kz,BigNumber &hz) { kz=kz/hz; } void operator %= (BigNumber &kz,BigNumber &hz) { kz=kz%hz; } BigNumber Number_Turn_BigNumber(long long x) { BigNumber kz; b[0]=0; while (x) { b[++b[0]]=x%10; x/=10; } return kz; } long long BigNumber_Turn_Number(BigNumber kz) { long long y=0; for (int i=b[0];i>=1;i--) y=y*10+b[i]; return y; } BigNumber gcd(BigNumber x,BigNumber y) { BigNumber r; while (y!=zero) { r=x; x=y; y=r%y; } return x; } BigNumber lcm(BigNumber x,BigNumber y) { BigNumber r=gcd(x,y); return x/r*y; } #define max(x,y) ((x>y)?x:y) #define min(x,y) ((x<y)?x:y) void write(BigNumber kz) { for (int i=b[0];i>=1;i--) putchar(b[i]+'0'); putchar('\n'); } int main() { zero.set0(); s.read(),t.read(); write(s+t); if (s>=t) write(s-t); else putchar('-'),write(t-s); write(s*t); write(s/t); write(s%t); return 0; }