一、c++实现大数相乘
1、为甚需要大数相乘
c++中由于int和flot的限制,在进行许多数相乘的时候,常常会出现超范围的情况,对于这种现象,我们就需要采用分治的思想,将其进行一位一位的处理,然后将其转换为字符串进行输出。
二、实现思想
将输入的两个数当成字符串,然后申请两个能够容纳两个字符串长度的数组,将其进行逆序存放,然后在申请一个能够容纳两个数据相乘之后的结果数组,这里要注意,结果数组长度最大不会草超过两个数据长度之和,因此在申请内存的时候,我们尽量不要申请太多(节约运算时间),结果数据中的值满足以下关系:
result[i+j]=data_a[i] * data_b[j]。
三、大数模板
string mutile1(string s1, string s2)
{
int sl_len = s1.length();
int s2_len = s2.length();
int i = 0; int j = 0;
//开始申请存储s1,s2的数组
int *data1 = (int *)malloc(sl_len * sizeof(sl_len));
int *data2 = (int *)malloc(s2_len * sizeof(s2_len));
//申请存放结果的数组,两数相乘,位数最多为sl_len + s2_len
int *result = (int *)malloc((sl_len + s2_len) * sizeof(sl_len + s2_len));
memset(data1,0, sl_len * sizeof(sl_len)); memset(data2, 0, s2_len * sizeof(s2_len)); memset(result, 0, (sl_len + s2_len) * sizeof(sl_len + s2_len));
//开始存放s1和s2,注意这里是倒叙存放
for (i = sl_len - 1, j = 0; i >= 0; i--, j++)
{
data1[i] = s1[j] - '0';
}
for (i = s2_len - 1, j = 0; i >= 0; i--, j++)
{
data2[i] = s2[j] - '0';
}
//开始进行相加,结果存放在result中
for (i = 0; i < sl_len; i++)
for (j = 0; j < s2_len; j++)
{
result[i + j] += data1[i] * data2[j];
}
//开始处理进位
for (i = 0; i < sl_len + s2_len; i++)
{
if (result[i] > 9)
{
result[i + 1] += result[i] / 10;
//cout << result[i + 1] << endl;
}
result[i] = result[i] % 10;
//cout << result[i] << endl;
}
//开始将结果合并 , 这里要倒叙合并
int index = 0;
string re = "";
for (i = sl_len + s2_len-1; i >= 0; i--)
{
if (result[i] == 0)
continue;
else
{
index = i;
break;
}
}
for (i = index; i >= 0; i--)
{
re += to_string(result[i]);
}
return re;
}
4、应用举例
比我我要实现 23*69 = 1589(用更大的数也可以使用,这里只是为了验证)
#include<iostream>
#include<cstring>
#include<malloc.h>
using namespace std;
string mutile1(string s1, string s2)
{
int sl_len = s1.length();
int s2_len = s2.length();
int i = 0; int j = 0;
//开始申请存储s1,s2的数组
int *data1 = (int *)malloc(sl_len * sizeof(sl_len));
int *data2 = (int *)malloc(s2_len * sizeof(s2_len));
//申请存放结果的数组,两数相乘,位数最多为sl_len + s2_len
int *result = (int *)malloc((sl_len + s2_len) * sizeof(sl_len + s2_len));
memset(data1,0, sl_len * sizeof(sl_len)); memset(data2, 0, s2_len * sizeof(s2_len)); memset(result, 0, (sl_len + s2_len) * sizeof(sl_len + s2_len));
//开始存放s1和s2,注意这里是倒叙存放
for (i = sl_len - 1, j = 0; i >= 0; i--, j++)
{
data1[i] = s1[j] - '0';
}
for (i = s2_len - 1, j = 0; i >= 0; i--, j++)
{
data2[i] = s2[j] - '0';
}
//开始进行相加,结果存放在result中
for (i = 0; i < sl_len; i++)
for (j = 0; j < s2_len; j++)
{
result[i + j] += data1[i] * data2[j];
}
//开始处理进位
for (i = 0; i < sl_len + s2_len; i++)
{
if (result[i] > 9)
{
result[i + 1] += result[i] / 10;
}
result[i] = result[i] % 10;
}
//开始将结果合并 , 这里要倒叙合并
int index = 0;
string re = "";
for (i = sl_len + s2_len-1; i >= 0; i--)
{
if (result[i] == 0)
continue;
else
{
index = i;
break;
}
}
for (i = index; i >= 0; i--)
{
re += to_string(result[i]);
}
return re;
}
int main()
{
string s1 = "23";
string s2 = "69";
string result = "";
result = mutile1(s1,s2);
cout<<result<<endl;
return 0;
}
5、程序输出

版权声明:本文为sinat_33909696原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。