c++大数相乘

一、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、程序输出

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思禾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值