没有合适的资源?快使用搜索试试~ 我知道了~
算法思想之分治法-大整数乘法问题.docx
0 下载量 49 浏览量
2023-10-28
20:32:06
上传
评论
收藏 19KB DOCX 举报
温馨提示
试读
12页
大整数乘法
资源推荐
资源详情
资源评论
2-算法思想之分治法-大整数乘法问题
2020-11-25 12:30:34 | 算法思想
算法–分治法之大整数乘法
问题描述
在计算机上处理一些大数据相乘时,由于计算机硬件的限制,不能直接进行相乘
得到想要的结果。可以将一个大的整数乘法分而治之,将大问题变成小问题,变
成简单的小数乘法再进行合并,从而解决上述问题。
问题分析
分析:大数据可以分解称高位和地位,比如 1534268973 可以表示为
15342*10^5+68973,那么两个大数据都进行拆解后,可以通过十字相乘获得 4 个
相对较小的乘法,将 4 个乘法的结果相加即可得到大数据相乘的结果。4 个相对
较小的乘法各自可以继续分解称 4 个更小的乘法,再进行合并。
举个例子: 3278×41926
=(32×10^2+78)×(419×10^2+26)
=32×419×10^4 + 32 × 26 × 10^2 + 78×419×10^2 + 78×26
继续拆分:
32×419×10^4
=(3×10+2)×(41×10+9)×10^4
=3×41×10^6 + 3×9×10^5 + 2×41×10^5 + 2×9×10^4
=123×10^6 + 27×10^5 + 82×10^5 + 18×10^4
=13408×10^4
算法实现
算法分析
实现大整数相乘需要三个主体函数,分解函数、乘法函数以及加法函数,分解函
数负责将大整数分解成高位和低位,然后乘法函数负责将两个数据的高位和地位
十字相乘获得各自的值,加法函数负责将 4 个相乘的值相加。分解函数需要 4 个
参数——需要分解的大整数 src,分解后的相对小的整数的空间 des,开始分解的
起始位置 Start 以及分解的长度 length。乘法函数同样需要 3 个参数——两个大整
数 multiplierA、multiplierB 和用来存储结果的数的空间 answer。加法函数与乘法
函数相同,需要 3 个参数——两个大整数 augend、addend 和用来存储结果的数
的空间。
代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdlib.h>
#include <cstring>
#include <iostream>
using namespace std;
#define M 100
char string_largeInteger_A[1000];
char string_largeInteger_B[1000];
typedef struct _Node
{
int data[M];
int length;
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int pow;
}Node, *pNode;
void Multiplie(pNode pa, pNode pb, pNode ans);
void Decompose(pNode src, pNode des, int Start, int
length);
void Add(pNode pa, pNode pb, pNode ans);
int main()
{
Node answer, largeInteger_A, largeInteger_B;
int digit;
cout << "输入大整数 a: " << endl;
cin >> string_largeInteger_A;
cout << "输入大整数 b: " << endl;
cin >> string_largeInteger_B;
digit = 0;
largeInteger_A.length =
strlen(string_largeInteger_A);
for (int i = largeInteger_A.length - 1; i >= 0; i--)
剩余11页未读,继续阅读
资源评论
xiaoshun007~
- 粉丝: 3781
- 资源: 3146
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功