C++大数乘法
2016-06-03 16:14
411 查看
大数据乘法,两个或者以上的大的数据相乘。
例如:
输入:987654321 123456789
输出:121932631112635269
大数据乘法主要用到的原理就是小时候学的竖式乘法。
实现代码的关键点有两个:
1、
这里假设a[i]、b[j]是输入的两个数,lena和lenb分别为他们的长度。
分析下代码,设a=45,b=23。即a[0]=4,a[1]=5;b[0]=2 ,b[1]=3。
则i = 0时pres[1] = 4 * 2 = 15,pres[2] = 4 * 3 = 12
i = 1时 pres[2] = 12 + 5 * 2 = 22,pres[3] = 15
2、
第一行代码是进位,第二行代码是取个位数。
这时,对15进位就是进1,取个位5。即pres[2] = 22 + 1,pres[3] = 5。
以此类推。
以下是完整代码:
例如:
输入:987654321 123456789
输出:121932631112635269
大数据乘法主要用到的原理就是小时候学的竖式乘法。
实现代码的关键点有两个:
1、
for (int i = 0; i < lena; i++) { for (int j = 0; j < lenb; j++) { pres[i + j + 1] += (a[i] - 48 )*(b[j] - 48); } }
这里假设a[i]、b[j]是输入的两个数,lena和lenb分别为他们的长度。
分析下代码,设a=45,b=23。即a[0]=4,a[1]=5;b[0]=2 ,b[1]=3。
则i = 0时pres[1] = 4 * 2 = 15,pres[2] = 4 * 3 = 12
i = 1时 pres[2] = 12 + 5 * 2 = 22,pres[3] = 15
2、
pres[i - 1] += pres[i] / 10; pres[i] %= 10;
第一行代码是进位,第二行代码是取个位数。
这时,对15进位就是进1,取个位5。即pres[2] = 22 + 1,pres[3] = 5。
以此类推。
以下是完整代码:
#include<iostream> #include<string.h> using namespace std; int main() { char a[100]; char b[100]; cin >> a; cin >> b; int lena = strlen(a); int lenb = strlen(b); int *pres = (int *)malloc(sizeof(int)*(lena + lenb)); memset(pres, 0, sizeof(int)*(lena + lenb)); for (int i = 0; i < lena; i++) { for (int j = 0; j < lenb; j++) { pres[i + j + 1] += (a[i] - 48 )*(b[j] - 48); } } for (int i = lena + lenb - 1; i >= 0; i--) { if (pres[i] >= 10) { pres[i - 1] += pres[i] / 10; pres[i] %= 10; } } int i = 0; while (pres[i] == 0) { i++; } char *lastres = (char*)malloc(sizeof(char)*(lena + lenb)); int j; for (j = 0; j < lena + lenb; j++, i++) { lastres[j] = pres[i] + 48 ; } lastres[j] = '\0'; cout << lastres << endl; return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性