ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-04-26 16:49:26  阅读:261  来源: 互联网

标签:string int str2 str1 up C++ len2 相乘 相减


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) {
	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;
}

运行结果:

加;

减:

乘:

标签:string,int,str2,str1,up,C++,len2,相乘,相减
来源: https://blog.csdn.net/weixin_40547071/article/details/89555964

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有