大数问题-相乘,相减,相加(C++实现)

C++自带的long long类型表示的最大值是9223372036854775807(19位),如果有两个超过这个范围的数进行运算,就不能使用C++编译器自带的+、-、*了。我们把这种大数用C++里面的string类型进行处理,处理过程中要注意进位、借位、字符转数字的问题。

相加:

string add(string str1, string str2)
{
	int len1, len2;
	int a[L],b[L];
	len1 = str1.length();
	len2 = str2.length();
	fill(a, a + L, 0);
	fill(b, b + L, 0);

	int i, j, k,up;
	string s;
	for (i = len1 - 1, k = 0; i >=0; --i)
	{
		a[k] = str1[i] - '0';//用数组倒着存储,从数组0开始存储,如果str1是1234,那么数组a就是4,3,2,1
		k++;
	}
	for (j = len2 - 1, k = 0; j >= 0; --j)
	{
		b[k] = str2[j] - '0';
		k++;
	}
	for (i = 0, up = 0; i < L; ++i)
	{
		a[i] = a[i] + b[i] + up;
		up = a[i] / 10;
		a[i] %= 10;
	}
	for (i =max(len1,len2); i >= 0; --i)
	{
		if (a[i])
		{
			break;   //a[L]数组从后往前找,第一个不为0的下标,str1+str2的长度最长为他们两中长的那个再加1
		}
	}
	for (k = i; k >= 0; --k)//从下标i开始拼接,倒着拼接
	{
		s += a[k]+'0';
	}
	return s;
}

相减:

string sub(string str1, string str2)
{
	bool flag = false;
	string s;
	if (str1 == str2)
		return "0";
	if (str1.size() < str2.size())
	{
		swap(str1, str2);
		flag = true;
	}
	if (str1.size() == str2.size())
	{
		if (str1 < str2)
		{
			swap(str1, str2);
			flag = true;
		}
	}
	int len1, len2;
	int a[L], b[L];
	len1 = str1.length();
	len2 = str2.length();
	fill(a, a + L, 0);
	fill(b, b + L, 0);

	int i, j, k, up;
	for (i = len1 - 1, k = 0; i >= 0; --i)
	{
		a[k] = str1[i] - '0';//用数组倒着存储,从数组0开始存储,如果str1是1234,那么数组a就是4,3,2,1
		k++;
	}
	for (j = len2 - 1, k = 0; j >= 0; --j)
	{
		b[k] = str2[j] - '0';
		k++;
	}
	for (i = 0, up = 0; i <= max(len1, len2)-1; ++i)
	{
		if (a[i] > b[i])//这块是大于号,不是大于等于号
		{
			a[i] = a[i] - b[i] - up;
			up = 0;
		}		
		else
		{
			a[i] = a[i] + 10 - b[i]-up;
			up = 1;
		}
	}
	for (i = max(len1, len2)-1; i >= 0; --i)
	{
		if (a[i])
		{
			break;   //a[L]数组从后往前找,第一个不为0的下标,str1-str2的长度最长为他们两中长的那个
		}
	}
	if (flag == true)
		s += '-';
	for (k = i; k >= 0; --k)//从下标i开始拼接,倒着拼接
	{
		s += a[k] + '0';
	}
	
	return s;
}

相乘:

string mul(string a, string b) {
    if(a=="0"||b=="0")
    {
        return “0”;//如果ab其中有一个是0,那么结果就是0,防止下面else出现0000结果的情况
    }
    else
    {
        string s;
    	int na[L], nb[L], nc[L], La = a.size(), Lb = b.size(), i, j;
	    fill(na, na + L, 0); 
	    fill(nb, nb + L, 0); 
	    fill(nc, nc + L, 0);
	    for (i = La - 1; i >= 0; i--) 
	    	na[La - i] = a[i] - '0';//先把字符转换成数字,然后倒着存入数组
	    for (i = Lb - 1; i >= 0; i--)
	    	nb[Lb - i] = b[i] - '0';
	    for (i = 1; i <= La; i++)
		    for (j = 1; j <= Lb; j++)
		    	nc[i + j - 1] += na[i] * nb[j];
	    for (i = 1; i <= La + Lb; i++)
	    {
	    	nc[i + 1] += nc[i] / 10;
		    nc[i] %= 10;
	    }		 
	    if (nc[La + Lb]) //m位数与n位数相乘最长为m+n位,最短位m+n-1位
		    s += nc[La + Lb] + '0';//如果最高位是1,把该位先拼接出来,如果是0,要把这个0舍去,不进行拼接
	    for (i = La + Lb - 1; i >= 1; i--)
		    s += nc[i] + '0';//倒着拼接
	    return s;
    }	
}

主函数

#include<string>
#include<iostream>
#include<math.h>
#include<algorithm>

using namespace std;

const int L = 11000;//可以在这块设置大数的范围

int main() {
	string x, y;
	cin >> x >> y;
	//cout << sub(x, y) << endl;
   // cout << mul(x, y) << endl;
    cout << add(x, y) << endl;
	system("pause");
	return 0;
}

运行结果:

加;

减:

乘:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值