大整数高精度计算

/*
 * author: heyang
 * date: 2020/2/5
 * time: 21:23
 * software: clion
 */

#include <iostream>
#include <cstring>
#include <algorithm>


using namespace std;

struct BigInt {
    int data[1024];
    int len;
    bool nagtive;

    BigInt() {
        memset(data, 0, sizeof(data));
        this->len = 0;
        this->nagtive = false;   // 默认为正
    }
};

BigInt str_to_bigint(char str[]);

void print_BigInt(BigInt &b);

int compare(BigInt &a, BigInt &b);

BigInt add(BigInt a, BigInt b);

BigInt sub(BigInt a, BigInt b);

BigInt multi_low(BigInt a, int b);

BigInt multi_high(BigInt a, BigInt b);

BigInt divide_low(BigInt a, int b, int &r);


BigInt str_to_bigint(char str[]) {
    BigInt b;
    int end = 0;
    if (str[0] == '-') {
        b.nagtive = true;
        end = 1;
    }
    for (int i = strlen(str) - 1; i >= end; --i) {
        b.data[b.len++] = str[i] - '0';
    }
    return b;
}


void print_BigInt(BigInt &b) {
    b.nagtive ? printf("-") : printf("");
    for (int i = b.len - 1; i >= 0; --i) {
        printf("%d", b.data[i]);
    }
};


int compare(BigInt &a, BigInt &b) {

    int flag = 1;
    if (a.nagtive && !b.nagtive) return -1;  // a为负, b为正
    if (!a.nagtive && b.nagtive) return 1;  // a为正, b为负
    if (a.nagtive && b.nagtive) {  // a, b 均为负  与 a, b均为正相反
        flag = -1;
    }
    if (a.len > b.len) return 1 * flag;
    else if (a.len < b.len) return -1 * flag;
    for (int i = a.len - 1; i >= 0; --i) {
        if (a.data[i] > b.data[i]) {
            return 1 * flag;
        } else if (a.data[i] < b.data[i]) {
            return -1 * flag;
        }
    }

    return 0;
}

BigInt add(BigInt a, BigInt b) {
    if (b.nagtive && !a.nagtive) {  // a +( -b ) <===> a - b
        b.nagtive = false;
        return sub(a, b);
    }
    if (!b.nagtive && a.nagtive) { // (-a)+b  <===>b-a
        a.nagtive = false;
        return sub(b, a);
    }
    BigInt c;
    if (b.nagtive && a.nagtive) c.nagtive = true;

    int carray = 0; // 进位
    int tmp;
    for (int i = 0; i < a.len || i < b.len; ++i) {
        tmp = a.data[i] + b.data[i] + carray;
        c.data[c.len++] = tmp % 10;
        carray = tmp / 10;
    }

    if (carray != 0) {
        c.data[c.len++] = carray;
    }
    return c;
}


BigInt sub(BigInt a, BigInt b) {

    if (!a.nagtive && b.nagtive) {  // a-(-b) <===> a+b
        b.nagtive = false;
        return add(a, b);
    }
    if (a.nagtive && b.nagtive) {  // -a-(-b)  <===> b-a
        a.nagtive = false;
        b.nagtive = false;

        return sub(b, a);
    }

    if (a.nagtive && !b.nagtive) {
        b.nagtive = true;
        return add(a, b);
    }


    BigInt c;
    if (compare(a, b) < 0) {
        swap<BigInt>(a, b);
        c.nagtive = true;
    }
    for (int i = 0; i < a.len || i < b.len; ++i) {
        if (a.data[i] < b.data[i]) {
            a.data[i + 1]--;
            a.data[i] += 10;
        }
        c.data[c.len++] = a.data[i] - b.data[i];
    }
    while (c.len - 1 >= 1 && c.data[c.len - 1] == 0) {
        c.len--;
    }
    return c;
}

BigInt multi_low(BigInt a, int b) {  // 高精度a与低精度b相乘
    BigInt c;
    if (!a.nagtive && b < 0 || a.nagtive && b > 0) {
        c.nagtive = true;

    }
    if (b < 0) {
        b = -b;
    }

    int carray = 0; // 进位
    int tmp;
    for (int i = 0; i < a.len; ++i) {
        tmp = a.data[i] * b + carray;
        c.data[c.len++] = tmp % 10;
        carray = tmp / 10;   // 进位
    }
    while (carray != 0) {
        c.data[c.len++] = carray % 10;
        carray /= 10;
    }
    return c;
}


BigInt multi_high(BigInt a, BigInt b) {

    BigInt c;
    if (a.nagtive && !b.nagtive || !a.nagtive && b.nagtive) {
        c.nagtive = true;
    }
    c.len = a.len + b.len;
    for (int i = 0; i < a.len; ++i) {
        for (int j = 0; j < b.len; ++j) {
            c.data[i + j] += a.data[i] * b.data[j];
        }
    }

    for (int i = 0; i < c.len; ++i) {
        if (c.data[i] > 9) {
            c.data[i + 1] += c.data[i] / 10;
            c.data[i] %= 10;
        }

    }

    while (c.len - 1 >= 1 && !c.data[c.len - 1]) {
        c.len--;
    }
    return c;
}


BigInt divide_low(BigInt a, int b, int &r) { //高精度a与低精度b相除余数为r a / b = c.....r
    BigInt c;
    if (!a.nagtive && b < 0 || a.nagtive && b > 0) {
        c.nagtive = true;

    }
    if (b < 0) {
        b = -b;
    }
    c.len = a.len;
    r = 0;
    for (int i = a.len - 1; i >= 0; --i) {
        r = r * 10 + a.data[i];
        if (r < b) c.data[i] = 0;  // 不够除, 该位为零
        else {
            c.data[i] = r / b;
            r = r % b;
        }
    }
    while (c.len - 1 >= 1 && c.data[c.len - 1] == 0) {  // 去除高位多余零
        c.len--;
    }
    if(a.nagtive){
        r = -r;
    }
    return c;


}


int main() {
    char tmp1[1024], tmp2[1024];

    int num;
    FILE *fi = fopen("content", "r");
    fscanf(fi, "%s %s %d", tmp1, tmp2, &num);
    fflush(fi);
    fclose(fi);


    printf("读入的数据如下: ");
    printf("%s %s %d\n", tmp1, tmp2, num);
    BigInt a = str_to_bigint(tmp1);
    BigInt b = str_to_bigint(tmp2);

    int r = 0;
    auto c = add(a, b);
    auto d = sub(a, b);
    auto e = multi_low(a, num);
    auto f = multi_high(a, b);
    auto g = divide_low(a, num, r);


    print_BigInt(a);
    printf("与");
    print_BigInt(b);
    printf("的运算结果如下:\n");
    printf("高精度+    ");
    print_BigInt(c);
    printf("\n");
    printf("高精度-    ");
    print_BigInt(d);
    printf("\n");
    printf("低精度*    ");
    print_BigInt(e);
    printf("\n");
    printf("高精度*    ");
    print_BigInt(f);
    printf("\n");
    printf("低精度/    ");
    print_BigInt(g);
    printf(".......%d\n", r);
    return 0;
}
H:\CPP_pro\pro01\a.exe
读入的数据如下: -21 -10 -10
-21-10的运算结果如下:
高精度+    -31
高精度-    -11
低精度*    210
高精度*    210
低精度/    2.......-1

Process finished with exit code 0
HugeCalc 是一款高精度算法库(同时支持 MBCS + UNICODE 版),适合于大规模科学计算,尤其适用于数论、密码学等领域研究,其核心算法耗费作者十余年的心血。具有占用资源少、效率高、使用便捷、易二次开发、可移植性强、可扩展性好等特点。关键文件 HugeCalc.dll 虽然很小,却提供了公共函数接口 709 个(标准C++接口 473 个;标准C接口 236 个),且其计算速度完全可与大型专业数学工具软件媲美! 现已提供了如下功能: ⊙ 高精度快速加法 ⊙ 高精度快速减法 ⊙ 高精度快速乘法 ⊙ 高精度快速除法 ⊙ 高精度快速同余 ⊙ 高精度快速位运算 ⊙ 高精度快速乘方 ⊙ 高精度快速开方 ⊙ 超大整数快速取对数 ⊙ 高精度快速求排列 ⊙ 高精度快速求组合 ⊙ 高精度快速阶乘、双阶乘、素数阶乘 ⊙ 高精度快速计算 Fibonacci、Lucas 数列 ⊙ 高精度快速乘积取模 ⊙ 高精度快速数论倒数取模运算 ⊙ 高精度快速乘方取模(支持负指数) ⊙ 高精度快速求最大公约数(支持群组运算) ⊙ 高精度快速计算扩展最大公约数 ⊙ 高精度快速求最小公倍数(支持群组运算) ⊙ 高精度快速“等幂和”(支持群组运算) ⊙ 高精度快速任意进制转换 ⊙ 超大整数素性快速检测 ⊙ 生成随机超大(素)整数、快速生成最邻近素数 ⊙ 自由指定有效位运算 ⊙ 强大而灵活的输出 ⊙ 高精度计时器(有暂停、累计、复位等功能) 为了与广大网友分享 HugeCalc 带来的便捷,该版公开了 HugeCalc.dll 的所有接口文件(同时支持 MBCS + UNICODE 版),大家可以更自由地进行高精度计算或自开发,而无须再依赖于 Mathematica 等大型软件。 V6.x 新增了各种标准导入接口,可方便各种编程语言进行二次开发,如 C++、C、VB、Delphi 等。 V7.x 可自动侦测用户 CPU 的型号,并据此自动调整算法及相应参数,使在兼顾老式机器的前提下,可充分发挥现代及未来 CPU 的功效(如采用 SSE2 指令集、多核并行等)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值