大整数高精度加减乘除
2017-02-27 15:01
267 查看
#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;//不够除,该位为0 else//够除 { c.d[i] = r / b;//商 r = r%b;//获得新的余数 } } while (c.len - 1 >= 1 && c.d[c.len - 1] == 0) { c.len--;//去除高位的0,同时至少保留一位最低位 } return c; }
相关文章推荐
- 高精度整数去位去最小问题
- 用位运算实现两个整数的加减乘除
- 大整数的加减乘除
- 高精度整数除法
- sgu112 高精度大整数乘方
- 整数高精度计算
- 大整数乘法(高精度)
- 转载高精度加减乘除法
- 大整数加减乘除运算类
- 【基础版】整数加减乘除计算器
- 高精度、大整数幂取模
- BigInteger大整数类高精度
- BZOJ 1263 [SCOI2006]整数划分 - 高精度乘法
- [BZOJ1263][SCOI2006]整数划分(数学+高精度)
- 实用算法实现-第 24 篇 高精度整数运算
- 整数大数模拟 高精度加法 高精度减法 高精度乘法 高精度除法 c/c++ java
- 【华为OJ】【039-无线OSS-高精度整数加法】
- 高精度模板【高精度加减乘除模带负数判定】
- 位运算实现整数加减乘除(计算机组成原理内容)
- 【快速傅里叶变换】【FFT】【WikiOI】【P3132】【高精度练习之超大整数乘法】