大数相乘和相加(当长整形都表示不了这个整数时,该如何进行计算呢?)

首先先写一个进位的函数

vector<int> jinwei(vector<int> result, int num, int digit)
{
	num = result[digit] + num;   //本位的进位数加上两个数在本位的和
	if (num >= 10)   //进位
	{
		int jin = num / 10;
		int save = num % 10;
		result[digit] = save;
		result = jinwei(result, jin, digit + 1);
	}
	else   //不进位
	{
		result[digit] = num;
	}
	return result;
}

1、大数相加

直接贴代码了

void bigadd()
{
	string str1;
	string str2;   //两个用字符串表示的数
	cin >> str1 >> str2;   //输入
	int len1 = str1.length();
	int len2 = str2.length();     //获取数字长度
	int n = len1 > len2 ? len1 + 1 : len2 + 1;    //两个数相加得到结果最大位数为其最大数的长度+1
	int i;
	vector<int> result(n);
	if (len1 > len2)   // 数字1比较大
	{
		for ( i = 0; i < len2; i++)    //先把两个数都有的位相加
		{
			int num1 = str1[len1 - 1 - i]-'0';
			int num2 = str2[len2 - 1 - i]-'0';
			int num = num1 + num2;
			result = jinwei(result, num, i);
		}
		for (; i < len1; i++)    //再把较大的数多余的位进行计算
			result = jinwei(result, str1[i] - '0', i);
	}
	else     //数字2比较大
	{
		for ( i = 0; i < len1; i++)
		{
			int num1 = str1[len1 - 1 - i] - '0';
			int num2 = str2[len2 - 1 - i] - '0';
			int num = num1 + num2;
			result = jinwei(result, num, i);
		}
		for (; i < len2; i++)
			result = jinwei(result, str2[i] - '0', i);
	}
	if (result[n - 1] == 0)   //最高位为0
		n--;
	for (int i = n - 1; i >= 0; i--)
		cout << char(result[i] + '0');
	return;
}

2、大数相乘

依然代码~

void bigmulti()
{
	string str1;
	string str2;   //两个用字符串表示的数
	cin >> str1 >> str2;    //输入
	int len1 = str1.length();
	int len2 = str2.length();       //获取数字长度
	int n = len1 + len2;    //两个数相乘,位数最多为两个数字位数之和,最少为和-1
	vector<int> result(n);
	for (int i = len1 - 1; i >= 0; i--)   //被乘数每一位依次和乘数的每一位进行乘法运算
	{
		for (int j = len2 - 1; j >= 0; j--)  //乘数的每一位
		{
			int num1 = str1[i] - '0';
			int num2 = str2[j] - '0';
			int num = num1*num2;
			int digit = len1 - 1 - i + len2 - 1 - j;
			result = jinwei(result, num, digit);
		}
	}
	if (result[n - 1] == 0)   //最高位为0
		n--;
	for (int i = n - 1; i >= 0; i--)
		cout << char(result[i] + '0');
	return ;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值