总结:大整数类加法、乘法
来源:互联网 发布:java手机 编辑:程序博客网 时间:2024/05/21 00:46
总结了一下大整数的加、乘操作涉及的代码。
需要注意的点:
- 注意C++类的语法,尤其是构造函数、重载内访问另一个对象
- 数字在数组中是逆序存放的,每一位都是十进制表示,用len来记录这个大整数的有效长度
- 加法操作时,由于两个数的长度可能不一,因此不能漏掉多出来的那一段,以及最后的溢出位。
- 乘法操作时,每一次外层循环(从最低位开始遍历第二个数)得到的乘法结果,要和前一次乘法结果错开一位相加。
- 输出时,注意len=0即数字为0的情况。
#include <iostream>#include <cstdio>#include <cstdlib>#include <string>#include <cstring>using namespace std;class BigInt //自定义大整数类{public: int num[105], len; //数字逆序存放 BigInt():len(0){} //初始化 BigInt(long long int n):len(0) //构造函数:long long int { while(n > 0) { num[len++] = n % 10; n /= 10; } } BigInt(string s):len(0) //构造函数:字符串 { for (int i = s.length()-1; i >= 0; --i) num[len++] = s[i]-'0'; } BigInt operator + (const BigInt & b) //重载+ { BigInt res; int cnt, carry = 0; //carry存放将要加到这一位结果的值 for (cnt = 0; cnt < this->len || cnt < b.len || carry > 0; ++cnt) //不要漏掉最后carry>0的情况 { if (cnt < this->len) carry += this->num[cnt]; if (cnt < b.len) carry += b.num[cnt]; res.num[cnt] = carry % 10; carry /= 10; } res.len = cnt; return res; } BigInt operator += (const BigInt & b) //重载+= { *this = *this + b; return *this; } BigInt operator * (const BigInt & b) //重载* { BigInt res; int mul[105] = {0}; //存放临时结果 for (int i = 0; i < b.len; ++i) //模拟乘法运算和错位相加,先不考虑进位 { for (int j = 0; j < len; ++j) mul[i+j] += b.num[i] * num[j]; } int last = 100; while (last >= 0 && mul[last] == 0) last--; //确定非0的最高位下标last if (last >= 0) { int carry = 0; for (int i = 0; i <= last; ++i) //统一进位 { mul[i] += carry; carry = mul[i] / 10; mul[i] %= 10; } if (carry) //最高位溢出 mul[last+1] = carry; res.len = (carry == 0) ? last+1 : last+2; //结果的长度 memcpy(res.num, mul, sizeof(int)*105); //数值拷贝到结果中 } return res; } BigInt operator *= (const BigInt &b) //重载*= { *this = *this * b; return *this; } void print() //输出 { printf("Length: %d\nValue: ", len); if (len == 0) //注意值为0时长度为0 { printf("0\n"); return; } for (int i = len-1; i >= 0; --i) printf("%d", num[i]); printf("\n"); }};const int maxn = 10005;BigInt a[maxn];void addTest() //POJ 1503---AC{ int i = 0; string s; BigInt ans(0); while (cin >> s && s != "0") { a[i] = BigInt(s); ans += a[i]; i++; } ans.print();}void mulTest() //测试:大数乘法{ string a,b; BigInt x, y, z; while(cin >> a >> b) { x = BigInt(a); y = BigInt(b); z = x * y; z.print(); }}void FibonacciAdd() //测试:计算斐波那契数列{ a[0] = BigInt(0); a[1] = BigInt(1); int n; while(cin >> n) { for (int i = 2; i <= n; ++i) { if (a[i].len == 0) a[i] = a[i-1] + a[i-2]; } a[n].print(); }}int main(){ //addTest(); //FibonacciAdd(); mulTest(); return 0;}
阅读全文
0 0
- 总结:大整数类加法、乘法
- 大整数的乘法、加法、减法
- 大整数加法和乘法STL
- 大整数问题,乘法,加法,阶乘
- 大整数的加法、减法和乘法
- 大整数的乘法与加法
- 大整数的加法和乘法运算
- 贪心算法-大整数乘法/加法/减法
- 大整数运算之 大整数加法、减法、乘法
- C++实现大整数类及其读入、输出、加法、乘法运算
- 双链表实现大整数的加法与乘法[VC++]
- [转]双链表实现大整数的加法与乘法[VC++]
- Java 实现大整数加法、乘法、阶乘运算
- 关于大整数乘法和加法的一些整理
- Java模拟两个大整数的加法、乘法、除法
- 大精度整数三种运算(加法,减法,乘法)
- 算法总结——大整数加法
- 算法总结——大整数乘法
- 小波折发现热部署
- iOS手写签名生成图片<贝赛尔曲线>
- Linux 命令代换反引号和$()
- 基于vue-strap的轮播组件,下载即用
- CALayer学习------------基本属性
- 总结:大整数类加法、乘法
- Java-QRCode生成二维码学习
- 总结和分析几种判断RecyclerView到达底部的方法
- 【集合类型的并发】Collections.synchronizedList
- 更新阿里yum源
- 微信支付》统一下单接口调用
- 1050. 螺旋矩阵(25)
- 微信小程序前端源码逻辑和工作流
- jQuery插件开发(二)