大整数高精度加减乘除

来源:互联网 发布:高性能javascript pdf 编辑:程序博客网 时间:2024/05/11 15:05
#include<cstdio>#include<cstring>struct bign{int d[1000];int len;bign(){memset(d, 0, sizeof(d));len = 0;}};bign change(char str[])//将整数转换为bign{bign a;a.len = strlen(str);//bign的长度就是字符串的长度for (int i = 0; i < a.len; i++){a.d[i] = str[a.len - i - 1] - '0';//逆着赋值}return a;}int compare(bign a, bign b)//比较a和b大小,a大、相等、a小分别返回1、0、-1{if (a.len > b.len)return 1;//a大else if (a.len < b.len)return -1;//a小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;//只要有一位a小,则a小}return 0;//两数相等}}bign add(bign a, bign b)//高精度a+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[c.len++] = temp % 10;//个位数为该位结果carry = temp / 10;//十位数为新的进位}if (carry != 0)//如果最后进位不为0,则直接赋给结果的最高位{c.d[c.len++] = carry;}return c;}bign sub(bign a, bign b)//高精度a-b{bign c;for (int i = 0; i < a.len || i < b.len; i++)//以较长的为界限{if (a.d[i] < b.d[i])//如果不够减{a.d[i + 1]--;//向高位借位a.d[i] += 10;//当前位加10}c.d[c.len++] = a.d[i] - b.d[i];//减法结果为当前位结果}while (c.len - 1 >= 1 && c.d[c.len - 1] == 0){c.len--;//去除高位的0,同时至少保留一位最低位}return c;}bign multi(bign a, int b)//高精度乘法{bign c;int carry = 0;//进位for (int i = 0; i < a.len; i++){int temp = a.d[i] * b + carry;c.d[c.len++] = temp % 10;//个位作为该位结果carry = temp / 10;//高位部分作为新的进位}while (carry != 0)//和加法不一样,乘法的进位可能不止一位,因此用while{c.d[c.len++] = carry % 10;carry /= 10;}return c;}bign divide(bign a, int 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;//不够除,该位为0else//够除{c.d[i] = r / b;//商r = r%b;//获得新的余数}}while (c.len - 1 >= 1 && c.d[c.len - 1] == 0){c.len--;//去除高位的0,同时至少保留一位最低位}return c;}

0 0