高精度系列算法模板

一、高精度乘法

#include <bits/stdc++.h>
using namespace std;
string sa, sb;
int la, lb, lc, jw, f, w, a[101], b[101], c[10200];
void bm() //可以当作模板
{
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    memset(c, 0, sizeof(c));
    la = sa.size();
    lb = sb.size();
    for (int i = 0; i < la; i++) //用数组来储存
        a[la - i - 1] = sa[i] - '0';
    for (int i = 0; i < lb; i++)
        b[lb - i - 1] = sb[i] - '0';
    jw = 0; //储存每一次乘法产生的进位
    for (int i = 0; i < la; i++)
        for (int j = 0; j < lb; j++)
        {
            f = a[i] * b[j];
            jw = f / 10;
            f %= 10;
            w = i + j; //当前位数的更新
            c[w] = c[w] + f;
            c[w + 1] = c[w + 1] + jw + c[w] / 10; //进位处理
            c[w] %= 10;
        }
    lc = lb + la;
    while (!c[lc]) //找到最高非0项
        lc--;
    if (lc < 0)
        cout << "0" << endl;
    else
    {
        for (int i = lc; i >= 0; i--)
            cout << c[i];
        cout << endl;
    }
    return;
}
int main()
{
    ios::sync_with_stdio(false);
    while (cin >> sa >> sb)
    {
        bm();
    }
    return 0;
}

二、高精度加法

#include <bits/stdc++.h>
using namespace std;
int main()
{
    char a1[1000], b1[1000];
    int a[1000] = {0}, b[1000] = {0}, c[1000] = {0}, la, lb, lc, i, x;
    cin >> a1 >> b1;
    la = strlen(a1);
    lb = strlen(b1);
    for (i = 0; i <= la - 1; i++)
    {
        a[la - i] = a1[i] - 48;
    }
    for (i = 0; i <= lb - 1; i++)
    {
        b[lb - i] = b1[i] - 48;
    }
    lc = 1, x = 0;
    while (lc <= la || lc <= lb)
    {
        c[lc] = a[lc] + b[lc] + x;
        x = c[lc] / 10;
        c[lc] %= 10;
        lc++;
    }
    c[lc] = x;
    if (c[lc] == 0)
    {
        lc--;
    }
    for (i = lc; i >= 1; i--)
    {
        cout << c[i];
    }
    cout << endl;
    return 0;
}
发布了33 篇原创文章 · 获赞 33 · 访问量 6164

猜你喜欢

转载自blog.csdn.net/acm_durante/article/details/104078374