大整数加法和乘法STL

 

整型数一般是4个字节,但是有时候经常会遇到超大数的运算,系统就没办法了(现在通常的32位系统下)

因此必须自己解决,我们来定义一个大整数类来解决 MyBigNum

 

代码如下:

 

#include <iostream>
#include <string>
#include <deque>
#include <functional>
#include <algorithm>

using namespace std;

class MyBigNum
{
	deque<int> v;
public:
	MyBigNum() {}
	MyBigNum(string strNum)
	{
		copy(strNum.begin(),strNum.end(),back_inserter(v));
		transform(v.begin(),v.end(),v.begin(),bind2nd(minus<int>(),'0'));
	}

	deque<int>::iterator begin()
	{
		return v.begin();
	}

	deque<int>::iterator end()
	{
		return v.end();
	}

	int size()
	{
		return v.size();
	}

	back_insert_iterator<deque<int> >Back_Inserter()
	{
		return back_inserter(v);
	}

	void push_front(int n)
	{
		v.push_front(n);
	}

	void push_back(int n)
	{
		v.push_back(n);
	}

	void adjust()
	{
		int nSize = v.size();

		for(int i = nSize-1;i >= 1; i --)
		{
			int value = v[i];
			if(value < 10)
				continue;
			v[i] = value%10;
			v[i-1] += value/10;
		}

		int value = v[0];
		if(value >= 10)
		{
			v[0] = value%10;
			value = value / 10;
			while(value > 0)
			{
				v.push_front(value%10);
				value /= 10;
			}
		}
		nSize = v.size();
	}

	MyBigNum Add(MyBigNum & m)
	{
		MyBigNum result;
		int n = size() - m.size();
		if(n >= 0)
		{
			transform(begin()+n,end(),m.begin(),result.Back_Inserter(),plus<int>());
			for(int i = n - 1; i >= 0 ;i --)
			{
				result.push_front(* (begin()+i));
			}
		}
		else
		{    //代码和上面一段一样很容易理解,只要注意n为负,转换过来和上面一样
			transform(begin(),end(),m.begin()-n,result.Back_Inserter(),plus<int>());
			for(int i = -n-1; i >= 0 ; i --)
			{
				result.push_front(*(m.begin()+i));
			}
		}

		result.adjust();

		return result;
	}

	MyBigNum  Multiply(MyBigNum &m)
	{
		MyBigNum result("0");
		MyBigNum mid;

		for(int i = m.size()-1 ;i >= 0; i --)
		{
			mid = *this;
			for(int j = 0 ; j < i ;j ++)
			{
				mid.push_back(0);
			}
			transform(mid.begin(),mid.end(),mid.begin(),bind2nd(multiplies<int>(),*(m.begin()+i)));
			result = mid.Add(result);  //Add函数内已经调用了调整函数
		}
		return result;
	}
};


int main()
{
	MyBigNum m1("1234567890");
	MyBigNum m2("99999999998");
	MyBigNum result = m1.Add(m2);
	cout << "1234567890 + 99999999998 = ";
	copy(result.begin(),result.end(),ostream_iterator<int>(cout));
	cout << endl;

	MyBigNum m3("99");
	MyBigNum m4("99999");
	MyBigNum m5 = m3.Multiply(m4);
	cout << "99 * 99999 = ";
	copy(m5.begin(),m5.end(),ostream_iterator<int>(cout));
	cout << endl;

	return 0;
}

 

三大算法:

 

adjust算法:

 

01> 获得待调整大整型数容器长度nSize

02> for  从最低位开始到次高位,循环依次调整每一位

03>               若当前位小于10,转到2

04>               当前位值等于当前值对10取余

05>               利用while循环把进位值依次加到前面位的值当中

06> end  for

07> if     最高位值大于10

08>               最高位值等于当前值对10取余

09>               改变容器大小,利用while循环把进位值依次填充新加位的值

10> endif

 

 

Add算法:

 

01> 定义结果大整型数变量result

02> 求被加数位数与加数位数差n

03> if  n >= 0  then

04>                 从最高位开始加数所有位与被加数所有位相加,每位结果和存入result后面

05>                 把被加数多余位存入result前面

06> else

07>                 从高位开始被加数所有位与加数所有位相应位相加,每位结果存入result后面

08>                 把加数多余位存入result前面

09> endif

10> result  <- result.adjust() ,进行位数值调整,保证result容器每位值都小于10

11> 返回result 给调用者

 

 

Multiply算法:

 

01> 定义结果大整型数result,初始值为0,用于累加

02> 定义临时大整型数变量mid

03> for i=0,i < 乘数位数 , i ++

04>             mid <- 被乘数大整型数

05>             mid 尾部添加适当个数0元素

06>             mid 中每位值等于mid中每位当前值乘以乘数从低位开始的第 i 位

07>             result <- mid.Add(result)

08> end for

09> 返回result给调用者

 

 

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/lfsblack/article/details/8211973
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞