大数相加及大数相乘

6 篇文章 0 订阅

参考文献

https://blog.csdn.net/koudaidai/article/details/7401857
https://blog.csdn.net/OrthocenterChocolate/article/details/36664901

C++ 基本数据类型长度

在这里插入图片描述

大数相加

#include <iostream>
#include <string>
using namespace std;
string plusfun(string num1, string num2){
	if (num1.size()<num2.size()){//把num1固定为位数较大的那个数,方便后面处理
		string temp = num1;
		num1 = num2;
		num2 = temp;
	}
	int length1 = num1.size(), length2 = num2.size(), flag = 0, a, b, sum;//flag是进位标记
	while (length1>0){//从低位开始把对应的位相加
		a = num1[length1 - 1] - '0';//获取num1当前位的数字
		if (length2 > 0)//如果num2还没加完(注意,num2是位数较少的)
			b = num2[length2 - 1] - '0';//获取num2当前位的数字
		else
			b = 0;//如果num2加完了,num2对应位上就没有数来加了
		//这时我没有break,因为虽然num2没有数字来加了,但可能还有进位需要加
		sum = a + b + flag;//num1与num2对应位上的数字相加,再加上进位位
		if (sum >= 10){//如果加起来大于于10,那就需要进位了
			num1[length1 - 1] = '0' + sum % 10;//计算加完之后,当前位应该是多少
			flag = 1;//把进位标记置1
		}
		else{
			num1[length1 - 1] = '0' + sum;//计算加完之后,当前位应该是多少
			flag = 0;//把进位标记置0
		}
		length1--;//向高位移动1位
		length2--;//向高位移动1位
	}
	//如果两个数对应位都加完了,进位位是1,说明位数要增加1了
	//比如99+1,加完之后,变成了三位数100,其实就是再在前面加一位1
	if (1 == flag)
		num1 = "1" + num1;
	return num1;
}
int main()
{
	string num1;
	string num2;
	string result;
	while (cin >> num1 >> num2){
		cout << "num1:" << num1.c_str() << endl;
		cout << "num2:" << num2.c_str() << endl;
		result = plusfun(num1, num2);
		cout << "sum:" << result.c_str() << endl;
	}
	return 0;
}

大数相乘

#include <iostream>
#include <string>
#include <vector>
using namespace std;
string plusfun(string num1, string num2){
	if (num1.size()<num2.size()){//把num1固定为位数较大的那个数,方便后面处理
		string temp = num1;
		num1 = num2;
		num2 = temp;
	}
	int length1 = num1.size(), length2 = num2.size(), flag = 0, a, b, sum;//flag是进位标记
	while (length1>0){//从低位开始把对应的位相加
		a = num1[length1 - 1] - '0';//获取num1当前位的数字
		if (length2 > 0)//如果num2还没加完(注意,num2是位数较少的)
			b = num2[length2 - 1] - '0';//获取num2当前位的数字
		else
			b = 0;//如果num2加完了,num2对应位上就没有数来加了
		//这时我没有break,因为虽然num2没有数字来加了,但可能还有进位需要加
		sum = a + b + flag;//num1与num2对应位上的数字相加,再加上进位位
		if (sum >= 10){//如果加起来大于于10,那就需要进位了
			num1[length1 - 1] = '0' + sum % 10;//计算加完之后,当前位应该是多少
			flag = 1;//把进位标记置1
		}
		else{
			num1[length1 - 1] = '0' + sum;//计算加完之后,当前位应该是多少
			flag = 0;//把进位标记置0
		}
		length1--;//向高位移动1位
		length2--;//向高位移动1位
	}
	//如果两个数对应位都加完了,进位位是1,说明位数要增加1了
	//比如99+1,加完之后,变成了三位数100,其实就是再在前面加一位1
	if (1 == flag)
		num1 = "1" + num1;
	return num1;
}
string fun(string num1, string num2){
	string result="0";
	vector<string>p;
	if (num1.size() < num2.size()){
		string temp = num1;
		num1 = num2;
		num2 = temp;
	}
	int length1 = num1.size(), length2 = num2.size(), flag = 0, a, b, mult;
	for (int i = length2 - 1; i >= 0; i--){
		b = num2[i] - '0';
		string multiply = num1;
		for (int j = length1 - 1; j >= 0; j--){
			a = num1[j]-'0';
			mult = a*b+flag;
			if (mult >= 10){
				multiply[j] = '0' + mult % 10;
				flag = mult / 10;
			}
			else{
				multiply[j] = '0' + mult;
				flag = 0;
			}
			
		}
		for (int k = 0; k < length2 - 1 - i; k++)
			multiply = multiply + '0';
		p.push_back(multiply);

	}
	for (int i = 0; i < p.size(); i++){
		result = plusfun(result, p[i]);
	}

	return result;
}

int main()
{
	string num1, num2, result;
	cin >> num1 >> num2;
	cout << "num1:" << num1.c_str() << endl;
	cout << "num2:" << num2.c_str() << endl;
	result = fun(num1, num2);
	cout << "mult:" << result.c_str() << endl;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值