高精减法求助!!!

P2142 高精度减法

@[WSx_3](/user/753246) 实在不行你手搓一个BigInt吧 ``` #include <iostream> #include <cstring> using namespace std; const int MAX_LEN = 50000; struct BigInt { int v[MAX_LEN]; int len; int sign; BigInt(int n) { memset(v,0,sizeof(v)); if (n>=0){ sign=1; } else{ sign=-1; } int i=0; while (true){ v[i++]=n%10; n/=10; if (n==0){ break; } } len=i; } BigInt(const char* a) { len=strlen(a); if (a[0]=='-'){ sign=-1; len-=1; for (int i=0;i<=len;++i){ if (a[len-i]!='-'){ v[i]=a[len-i]-'0'; } } } else{ sign=1; for (int i=0;i<len;++i){ v[len-i-1]=a[i]-'0'; } } } int compare(const BigInt& b) { if (len<b.len){ return -1; } if (len>b.len){ return 1; } for (int i=len-1;i>=0;--i){ if (v[i]<b.v[i]){ return -1; } if (v[i]>b.v[i]){ return 1; } } return 0; } void add(const BigInt& b) { int i=0,x=0; int blen=b.len; while ((i<len) || (i<blen)){ v[i]=v[i]+b.v[i]+x; x=v[i]/10; v[i]%=10; ++i; } if (x > 0){ v[i]=x; len = i + 1; } else { len = i; } } void sub(const BigInt& b) { int i=0,x=0,y[MAX_LEN]; int blen=b.len; int f=compare(b); if (f==0){ len=1; v[0]=0; return; } if (f>=1){ for (i=0;i<len;++i){ if (v[i]<b.v[i]){ v[i]+=10; v[i+1]-=1; } v[i]-=b.v[i]; } for (int i=len-1;i>=0;--i){ if (v[i]==0){ len-=1; } else{ break; } } } else{ for (i=0;i<len;++i){ if (b.v[i]<v[i]){ //b.v[i]+=10; v[i+1]-1; } v[i]-=b.v[i]; } for (int i=0;i<len;++i){ if (v[i]==0){ len-=1; } } } } void mul(const BigInt& b) { int c[MAX_LEN]; memset(c,0,sizeof(c)); for (int i=0;i<len;++i){ int x=0; for (int j=0;j<b.len;++j){ c[i+j]=v[i]*b.v[j]+x+c[i+j]; x=c[i+j]/10; c[i+j]=c[i+j]%10; } c[i+b.len]=x; } memcpy(v,c,sizeof(c)); len = len + b.len; while(v[len-1]==0){ len--; } } void mul(int b) { int x=0; for (int i=0;i<len;++i){ v[i]=v[i]*b+x; x=v[i]/10; v[i]=v[i]%10; } while (x) { v[len++]=x%10; x/=10; } } void div(int b,int& m) { int x=0; for (int i=len-1;i>=0;--i){ int t=v[i]; v[i]=(x*10+v[i])/b; x=(x*10+t)%b; } m = x; for (int i=len-1;i>=0;--i){ if (v[i]==0){ len-=1; } else{ break; } } } void div(int b) { long long x=0; for (int i=len-1;i>=0;--i){ int t=v[i]; v[i]=(x*10+v[i])/b; x=(x*10+t)%b; //cout << x << endl; } for (int i=len-1;i>=1;--i){ if (v[i]==0){ len-=1; } else{ break; } } } void div(const BigInt&b) { int x=0; for (int i=len-1;i>=0;--i){ for (int j=0;j<b.len;++j){ int t=v[i]; v[i]=(x*10+v[i])/b.v[j]; x=(x*10+t)%b.v[j]; } } for (int i=len-1;i>=0;--i){ if (v[i]==0){ len-=1; } else{ break; } } } }; std::ostream& operator<<(std::ostream& os, const BigInt& b) { if (b.sign<0){ cout<<"-"; } for(int i = b.len - 1;i >= 0; --i){ os << b.v[i]; } return os; } int main() { char a[MAX_LEN]; int b; cin>>a>>b; BigInt n(a); n.div(b); cout<<n; } ```
by ikun_god @ 2024-02-11 08:59:35


|