美文网首页
大整数运算

大整数运算

作者: km15 | 来源:发表于2020-02-13 19:22 被阅读0次

一、定义、赋值、比较、输出
1、大整数的结构体

struct bign {
    int d[1000];
    int len;
    bign() {
        memset(d, 0, sizeof(d));
        len = 0;
    }
};

2、逆着赋值(先用字符串读入,再把字符串另存值bign结构体)
思想:1、生成结构体 2、赋值len 3、for逆着赋值

bign change(char str[]) {
    bign a;
    a.len = strlen(str);
    for (int i = 0;i < a.len;++i) {
        a.d[i] = str[a.len - i - 1] - '0';
    }

    return a;
}

3、比较两个bign变量大小
思想:1、先比较长度,长度不同则以长的为大 2、长度相同,则从高到低比较

int compare(bign a, bign b) {
    if (a.len > b.len)  return 1;   //a大
    else if (a.len < b.len) return -1;  //b大
    else {
        for (int i = a.len - 1;i >= 0;--i) {    //從高到低比较
            if (a.d[i] > b.d[i])    return 1;   //只要有一位a大,则a大
            else if (a.d[i] < b.d[i]) return -1;    //只要有一位b大,则b大
        }
        return 0;       //两数相等
    }
}

二、四则运算(高精度加法,高精度减法,高精度与低精度乘法,高精度与低精度除法)
1、加法
思想:其中一位加法,改为上的两个数字和进位相加,得到的结果个位数作为该位的结果,取十位数作为进位

bign add(bign a, bign b) {
    bign c;
    int carry = 0;  //carry是进位
    for (int i = 0;i < a.len || i < b.len;++i) {    //以较长为界限
        int temp = a.d[i] + b.d[i] + carry; //两个对应为与进位相加
        c.d[len++] = temp % 10; //个位数为结果
        carry = temp / 10;  //十位数位进位
    }
    if (carry != 0) {
        c.d[len++] = carry;
    }
    return c;
}

注意:
(1)以上写法都是非负整数
(2)如果有一方式负数,可以再转换数组这一步去掉其负号,然后采用高精度减法
(3)如果两个都是负数,就都去掉负号,然后高精度加法,最后再加上负号

2、减法
思想:对某一步,比较被减位和减位,如果不够减,则令被减位的高位减1,被减位加10再进行减法;
如果够减,则直接减。
最后一步要注意减法后高位可能有多余的0,要五十他们,但也要保证结果至少有一位数

bign sub(bign a, bign b) {
    bign c;
    for (int i = 0;i < a.len || b.len;i++) {
        if (a.d[i] < b.d[i]) {
            a.d[i + 1]--;   //向高位借位
            a.d[i] += 10;   //当前位加10
        }
        c.d[len++] = a.d[i] - b.d[i];   //减法结果为当前位结果
    }
    whilw(c.len - 1 >= 1 && c.[c.len - 1] == 0) {
        c.len--;    //去除高位的0,同时至少保留一位最低位
    }
    return c;
}

注意:
1、使用sub函数需要比较两个数大小,如果被减数小于减数,
交换两个变量
输出符号
再使用sub函数

3、高精度与低精度乘法
思想:去bign某位与Int整体相乘,再与进位相加,所得结果的个位数作为该位结果,高位部分作为新的进位

bign multi(bign a, bign b) {
    bign c;
    int carry = 0;  //进位
    for (int i = 0;i < a.len;i++) {
        int temp = a.d[i] * b + carry;  
        c.d[len++] = temp % 10; //个位作为该位的结果
        carry = temp / 10;  //高部分作为新的进位
    }
    while (carry != 0) {
        c.d[len++] = carry % 10;    //和加法不一样,乘法的进位可能不止一位,需要用while
        carry /= 10;
    }
    return c;
}

注意:
如果a和b中存在负数,需要先记录负号,然后取绝对值进入函数

4、高精度与低精度除法
算法思想:
1、得出某一步的步骤:上一步的余数乘以10加上该步的位,得到该步临时的被除数,
2、将其与除数比较,如果不够除,则该位的商为0,如果够除,则商为对应的商,余数为对应的余数
3、最后一步要注意减法后高位可能有多余的0,要忽视他们,但也要保证结果至少有一位

bign divide(bign a, bign b,int & r) {   //高精度除法,r为余数
    bign c;
    c.len = a.len;  //被除数的每一位和商的每一位是一一对应的,因此先令长度相等
    for (int i a.len - 1;i >= 0;--i) {
        r = r * 10 + a.d[i];
        if (r < b) c.d[i] = 0;  //不够除
        else{   //够除
            c.d[i] = r / b; //商
            r = r % b;  //获得新的余数
        }
    }

    while (c.len - 1 >= 1 && c.d[len - 1] == 0) {
        c.len--;    //取出高位的0,同时至少保留一位最低位
    }
    return c;
}

注意:
1、很多题目要求得出商和余数,但只能返回一个值,所以把余数作为引用,或者作为全局变量

相关文章

  • 大整数运算

    一、定义、赋值、比较、输出1、大整数的结构体 2、逆着赋值(先用字符串读入,再把字符串另存值bign结构体)思想:...

  • 大整数运算

    大整数运算 大整数存储 在C语言中若要计算A+B,如果A和B的在范围int(或long)范围内,那很容易就可以写出...

  • js大整数运算

    对于大整数,是指超过规定类型的整数,它一般的存储类型为字符串类型char。在JS中,需要将字符串中的每一位字符利用...

  • JS实现大整数运算

    首先,对于大整数,是指超过规定类型的整数,它一般的存储类型为字符串类型char。在JS中,需要将字符串中的每一位字...

  • Java程序基础--整数运算

    整数运算即使是除法运算,也是精确的,两个整数相除只能得到结果的整数部分。 求余运算用% 注意:整数的除法对于除数为...

  • shell运算详解

    shell中常见的运算命令 运算操作符与运算命令意义(())用于整数运算的常用运算符,效率很高let用于整数运算,...

  • MOD 运算

    mod运算,即求余运算,是在整数运算中求一个整数 x 除以另一个整数y的余数的运算,且不考虑运算的商。在计算机程序...

  • Python的整数与浮点数

    整数和浮点数混合运算的结果是浮点数整数运算中

  • 你可能不知道的python知识点

    基本数据类型 1.整数和浮点数 整数的运算速度更快,所以浮点数运算的时候,可以先把小数点去掉,当成整数运算后,添加...

  • 2019-06-29

    整数相加输出整数运算结果。字符和整数相加会输出字符ASCII码和整数的运算结果。而字符串再加其他类型都为字符串。 ...

网友评论

      本文标题:大整数运算

      本文链接:https://www.haomeiwen.com/subject/uijlfhtx.html