Luogu2005 A/B Problem II
阿新 • • 發佈:2020-07-29
https://www.luogu.com.cn/problem/P2005
高精度除法
模板題,居然發現還沒填上小學時高精除高精的坑(一定是我太菜了)
用減法模擬除法,只要大於除數,就暴力減,這一位的\(ans++\)
\(C++ Code:\)
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #define N 100005 using namespace std; int alen,blen,a[N],b[N],c[N],t[N],p[N],q[N]; char A[N],B[N]; bool cop(int *a,int *b) { if (a[0]<b[0]) return false; if (a[0]>b[0]) return true; for (int i=1;i<=a[0];i++) if (a[i]^b[i]) return a[i]>b[i]; return true; } void del(int a[],int *b) { p[0]=a[0]; for (int i=1;i<=a[0];i++) p[i]=a[a[0]-i+1]; for (int i=1;i<=a[0];i++) { if (p[i]<q[i]) p[i]+=10,p[i+1]--; p[i]-=q[i]; } while (!p[p[0]]&&p[0]!=1) p[0]--; a[0]=p[0]; for (int i=1;i<=a[0];i++) a[i]=p[a[0]-i+1]; } void cf(int *a,int *b) { for (int i=1;i<=alen;i++) { t[++t[0]]=a[i]; while (cop(t,b)) { del(t,b); c[i]++; } } bool flag=true; for (int i=1;i<=alen;i++) if (flag&&!c[i]) continue; else { flag=false; putchar(c[i]+'0'); } if (flag) putchar('0'); putchar('\n'); } int main() { scanf("%s%s",A+1,B+1); alen=strlen(A+1),blen=strlen(B+1); a[0]=alen,b[0]=blen; for (int i=1;i<=alen;i++) a[i]=A[i]-'0'; for (int i=1;i<=blen;i++) b[i]=B[i]-'0'; for (int i=1;i<=b[0];i++) q[i]=b[b[0]-i+1]; cf(a,b); return 0; }