大整数乘法(简单模拟乘法过程)

一、分析

整数的数值超过计算机硬件所能表示的最大值时,那么我们只能借助软件的方法来实现大整数的乘法了。

我们可以使用字符串来模拟大整数的乘法,算法的思想就是使用我们在小学时学过的乘法,一位位相乘,最后计算出结果。如下:

1  
 2    3

x  
 1    2

------------------------

2 4
6

1 2 3

------------------------

1 4
7 6

为了模拟乘法过程,我们需要使用两个字符串变量,一个保存每一步乘积结果,另一个保存最终的结果。

时间复杂度:算法时间总要消耗在两层循环中,故时间复杂度为O(n^2)。

二、代码实现

#include <iostream>
#include <string>
#include <vector>

using namespace std;

//求两个大数的乘积(两数均为正数)
string GetProductOfTwoBigNum( string strNumLeft, string strNumRight )
{
	////////////////////////////////////
	//使用小学所学方法,计算两个大数乘积
	///////////////////////////////////

	if ( strNumRight.empty() && strNumRight.empty() )
	{
		return string("0");
	}

	//转换为数字
	for( string::size_type i = 0; i < strNumLeft.size(); ++i )
	{
		strNumLeft[i] -= '0';
	}
	for( string::size_type i = 0; i < strNumRight.size(); ++i )
	{
		strNumRight[i] -= '0';
	}

	string::size_type nMaxBits = strNumLeft.size() + strNumRight.size() + 1;//最大位数,多增加一位,便于编码
	string strProduct( nMaxBits, NULL );//保存每步乘积累加之和
	char szTemp = NULL;//每位乘积,辅助变量
	char szCarrayTemp = NULL;//进位信息

	for( int i = strNumRight.size() - 1; i >= 0; --i )
	{
		string strProductStep( nMaxBits, NULL );//保存每步之和
		int k = strNumRight.size() - i - 1;
		for( int j = strNumLeft.size() - 1; j >= 0; --j )
		{
			szTemp = ( strNumRight[i] * strNumLeft[j] + strProductStep[k] ) % 10;
			szCarrayTemp = ( strNumRight[i] * strNumLeft[j] + strProductStep[k] ) / 10;

			strProductStep[k] = szTemp;
			strProductStep[++k] += szCarrayTemp;
		}

		//将这一步结果累加strProduct中
		for( string::size_type m = 0; m < nMaxBits - 1; ++m )
		{
			szTemp = ( strProductStep[m] + strProduct[m] ) % 10;
			szCarrayTemp = ( strProductStep[m] + strProduct[m] ) / 10;

			strProduct[m] = szTemp;
			strProduct[m+1] += szCarrayTemp;
		}
	}

	//返回遍历strProduct,从而取出计算的结果
	string strResult;
	int k = nMaxBits - 1;
	while( k >= 0 && strProduct[k] == NULL )
	{
		--k;
	}
	for( ; k >= 0; --k )
	{
		strResult.push_back( strProduct[k] + '0');//转换为字符
	}

	if ( strResult.empty() )
	{
		strResult.push_back( '0' );
	}

	return strResult;
}

int main()
{
	string strNumLeft;
	string strNumRight;

 	cout << "输入两个乘数:";
	while( cin >> strNumLeft >> strNumRight )
	{
		string strResult = GetProductOfTwoBigNum( strNumLeft, strNumRight );
		cout << "两数之积:" << strResult << endl;
		cout << "-------------------------------------------------" << endl;
		cout << "输入两个乘数:";
	}

	return 0;
}

三、运行结果

作者:山丘儿

转载请标明出处,谢谢。原文地址:http://blog.csdn.net/s634772208/article/details/46505949

时间: 2024-12-28 13:03:57

大整数乘法(简单模拟乘法过程)的相关文章

大整数算法[08] Comba乘法(原理)

★ 引子          原本打算一篇文章讲完,后来发现篇幅会很大,所以拆成两部分,先讲原理,再讲实现.实现的话相对复杂,要用到内联汇编,要考虑不同平台等等. 在大整数计算中,乘法是非常重要的,因为在公钥密码学中模幂运算要频繁使用乘法,所以乘法的性能会直接影响到模幂运算的效率.下面将会介绍两种乘法:基线乘法和 Comba 乘法,尽管他们的原理和计算看起来十分类似,而且算法的时间复杂度都是 O(n^2),但是他们的效率差别是很大的. ★ 基线乘法 (Baseline Multiplication

大整数算法[11] Karatsuba乘法

★ 引子         前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) 的限制,需要从一个完全不同的角度来看待乘法.在下面的乘法算法中,需要使用 x 和 y 这两个大整数的多项式基表达式 f(x) 和 g(x) 来表示. 令 f(x) = a * x + b,g(x) = c * x + d,h(x) = f(x) * g(x).这里的 x 相当于一个基,比如十进制下,

[转]大整数算法[11] Karatsuba乘法

★ 引子         前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) 的限制,需要从一个完全不同的角度来看待乘法.在下面的乘法算法中,需要使用 x 和 y 这两个大整数的多项式基表达式 f(x) 和 g(x) 来表示. 令 f(x) = a * x + b,g(x) = c * x + d,h(x) = f(x) * g(x).这里的 x 相当于一个基,比如十进制下,

大整数算法[10] Comba乘法(实现)

★ 引子 上一篇文章讲了 Comba 乘法的原理,这次来讲讲如何实现.为了方便移植和充分发挥不同平台下的性能,暂时用了三种不同的实现方式: 1.单双精度变量都有的情况. 2.只有单精度变量的情况. 3.可以使用内联汇编的情况. 前面已经介绍了 Comba 乘法的原理和实现思路,为了方便,再把它贴到这里: 计算 c = a * b,c0,c1,c2 为单精度变量. 1. 增加 c 到所需要的精度,并且令 c = 0,c->used = a->used + b->used. 2. 令 c2

字符串+数组模拟大整数乘法

C/C++中存在精度问题,很难做到大整数的加法和乘法操作,这里给出大整数的模拟乘法运算. 模拟原理: 模拟每一个位的值进行相乘,并使其加到对应的位置上,最后保证每一位的数都小于10,即从尾到头扫描一遍进位即可. 主要代码: k=(mx-i)+(mbx-j);//相乘后的位置 c[k-1]+=sum%10; c[k]+=sum/10; for(t=1;t<=k;++t){//保证每一位上的数都小于10 if(c[t]>=10){ //cout<<c[t]<<"

N!的阶乘附带简单大整数类的输入输出(暂时没有深入的了解)

Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! 我的思路:就想着大整数类去了,才发现自己还不能很好的掌握,其实这是一个大整数与int的乘法,一个50000的数组完全可以解决,看来分析问题的能力还是比较弱呀,希望能够提升分析问题的全局能力! #include<iostream>#include<cstdio>#include<string>#include<cstring>#inc

python实现大整数相乘---格子乘法

以前做ACM的时候,许多人都通过 BigInteger 来实现大数乘法,让我记忆犹新的事2012年的辽宁省赛在大连大学,第一道水题就是大整数乘法,那时还不会java. 大数乘法的实现是基于印度的格子乘法,使用这种方法,计算 m 位数乘以 n 位数只需要创建一个 m+n 位的数组保存结果即可. 今天我们来用python来模拟一下格子算法的运算过程,python来写算法还是很简单的. 下面是从维基百科上爬下来的图片和详细步骤. 第一步:画带斜线的格子,将第一数(58)写在格子顶部,第二数(213)书

poj2389-Bull Math(大整数乘法)

一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425  5 5 5  5 5 5 x   3 5 x    3 5 -----------   ==>    ----------   2 7 7 5 25 25 25    + 1 6 6 5   +15 15 15 -------------  -----------------    1 9 4 2 5 15 40 40 2

分治法解大整数乘法

在某些情况下,需要处理很大的整数,它无法在计算机中精确的表述和处理.若要精确的表示大整数,就必须使用软件的方法来实现大整数的运算.最常用的解决大整数运算的方法是使用一个二重循环,其算法时间复杂度为O(m*n)(其中m,n分别为两个大整数的长度):而选用分治方法则可以将算法时间复杂度降到O(n^(log3))(两个大整数的长度同为n).但分治方法的算法实现较为复杂,针对这个问题,本文借助标准C++实现了分治方法求解大整数乘法的算法. 下面分别介绍两种算法原理,及其实现: 1.使用二重循环控制两个数