求调。高精度有点脾气,它不想高精了(2~9RE)
查看原帖
求调。高精度有点脾气,它不想高精了(2~9RE)
516714
zren6ing楼主2024/7/26 10:43
#include <bits/stdc++.h>
using namespace std;
const int kmaxn = 1e5 + 5;
int a[kmaxn], b[kmaxn], c[kmaxn];
string s1, s2;
void clear()
{
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    memset(c, 0, sizeof(c));
    cout << "\n";
}
void add(string n, string m)
{
    int len1 = n.size();
    int len2 = m.size();
    for (int i = 0; i < len1; i++)
    {
        a[i] = n[len1 - i - 1] - '0';
    }
    for (int i = 0; i < len2; i++)
    {
        b[i] = m[len2 - i - 1] - '0';
    }
    int len = max(len1, len2);
    for (int i = 0; i < len; i++)
    {
        c[i] = a[i] + b[i];
    }
    for (int i = 0; i < len; i++)
    {
        c[i + 1] += c[i] / 10;
        c[i] %= 10;
    }
    while (c[len] == 0 && len > 1)
    {
        len--;
    }
    if (c[len] > 0)
    {
        len++;
    }
    for (int i = len - 1; i >= 0; i--)
    {
        cout << c[i];
    }
}
void jian(string n, string m)
{
    if (n.size() < m.size() || n.size() == m.size() && n < m)
    {
        swap(n, m);
        cout << "-";
    }
    int len1 = n.size();
    int len2 = m.size();
    for (int i = 0; i < len1; i++)
    {
        a[i] = n[len1 - i - 1] - '0';
    }
    for (int i = 0; i < len2; i++)
    {
        b[i] = m[len2 - i - 1] - '0';
    }
    for (int i = 0; i < len1; i++)
    {
        if (a[i] < b[i])
        {
            a[i + 1]--;
            a[i] += 10;
        }
        c[i] = a[i] - b[i];
    }
    while (c[len1 - 1] == 0 && len1 > 1)
    {
        len1--;
    }
    for (int i = len1 - 1; i >= 0; i--)
    {
        cout << c[i];
    }
}
void chen(string n, string m)
{
    int len1 = n.size();
    int len2 = m.size();
    for (int i = 0; i < len1; i++)
    {
        a[len1 - i] = n[i] - '0';
    }
    for (int i = 0; i < len2; i++)
    {
        b[len2 - i] = m[i] - '0';
    }
    for (int i = 1; i <= len1; i++)
    {
        for (int j = 1; j <= len2; j++)
        {
            c[i + j - 1] += a[i] * b[j];
            c[i + j] += c[i + j - 1] / 10;
            c[i + j - 1] %= 10;
        }
    }
    int len = len1 + len2;
    while (c[len] == 0 && len > 1)
    {
        len--;
    }
    for (int i = len; i >= 1; i--)
    {
        cout << c[i];
    }
}
int cmp(int aa[], int bb[])
{
    if (aa[0] > bb[0])
    {
        return 1;
    }
    if (aa[0] < bb[0])
    {
        return -1;
    }
    for (int i = aa[0]; i > 0; i--)
    {
        if (aa[i] > bb[i])
        {
            return 1;
        }
        if (aa[i] < bb[i])
        {
            return -1;
        }
    }
    return 0;
}
int t[kmaxn];
void chu(string n, string m)
{
    a[0] = n.size();
    b[0] = m.size();
    c[0] = a[0] - b[0] + 1;
    for (int i = 1; i <= a[0]; i++)
    {
        a[i] = n[a[0] - i] - '0';
    }
    for (int i = 1; i <= b[0]; i++)
    {
        b[i] = m[b[0] - i] - '0';
    }

    for (int i = c[0]; i > 0; i--)
    {
        memset(t, 0, sizeof(t));
        for (int j = 1; j <= b[0]; j++)
        {
            t[j + i - 1] = b[j];
        }
        t[0] = b[0] + i - 1;
        while (cmp(a, t) >= 0)
        {
            c[i]++;
            if (!cmp(a, t))
            {
                a[0] = 0;
                continue;
            }
            for (int j = 1; j <= a[0]; j++)
            {
                if (a[j] < t[j])
                {
                    a[j + 1]--;
                    a[j] += 10;
                }
                a[j] -= t[j];
            }
            while (a[0] > 0 && !a[a[0]])
            {
                a[0]--;
            }
        }
    }
    while (c[0] > 0 && !c[c[0]])
    {
        c[0]--;
    }
    if (!c[0])
    {
        cout << 0;
    }
    else
    {
        for (int i = c[0]; i > 0; i--)
        {
            cout << c[i];
        }
    }
}
string Mod(string n, string m)
{
    int a = stoi(m);
    int b = 0;
    int len = n.size();
    for (int i = 0; i < len; i++)
    {
        int c = b * 10 + (n[i] - '0');
        b = c % a;
    }
    return to_string(b);
}
int main()
{
    cin >> s1 >> s2;
    add(s1, s2);
    clear();
    jian(s1, s2);
    clear();
    chen(s1, s2);
    clear();
    chu(s1, s2);
    clear();
    cout << Mod(s1, s2) << "\n";
    clear();
    return 0;
}
2024/7/26 10:43
加载中...