1. 程式人生 > 實用技巧 >Luogu2005 A/B Problem II

Luogu2005 A/B Problem II

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;
}