Luogu2005 A/B Problem II

Posted gk0328

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(‘
‘);
}
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;
}

以上是关于Luogu2005 A/B Problem II的主要内容,如果未能解决你的问题,请参考以下文章

定根最小树形图 朱刘算法 luogu P4716

J - A + B Problem II(第二季水)

A + B Problem II

luogu_1601 A+B Problem(高精)

A + B Problem II

「Luogu2522」[HAOI2011]Problem b