Sicily 1381. a*b【高精度乘法】

题目链接在此


乘法就是加法,高精度乘法肯定要有高精度加法支撑啦。

不过对于x*y,相比于直接把x的加法循环y次,不如来点快捷的(而且乘数y也很大,循环怎么弄?)!

每次只拿xy的个位数相乘(也就是循环做加法),然后把被乘数x末尾添加“0”(也就是把x乘以10),再把y抹去最后一位。进入下次循环直到y变成空串为之。

本来STL里的string类有很多方便的函数,比如back()取末尾字符,pop_back()删除末尾字符等等,但西西里都不让用。所以只好写得别扭一些了=。=


#include<iostream>
#include<string>

using namespace std;

int charToInt(char a) {  //  字符转成整型的函数
	return a - '0';
}

char intToChar(int n) {  //  整型转成字符的函数
	return n + '0';
}

string add(string a, string b) {  //  高精度加法
	if (a.size() > b.size())  //  确保a短b长
		swap(a, b);

	while (a.size() < b.size())
		a = "0" + a;

	string result(a.size(), '0');
	int carry = 0;

	for (int i = a.size() - 1; i >= 0; i--) {
		result[i] = intToChar((charToInt(a[i]) + charToInt(b[i]) + carry) % 10);
		carry = (charToInt(a[i]) + charToInt(b[i]) + carry) / 10;
	}

	return carry ? ("1" + result) : result;
}

string multiply(string a, string b) {
	string product = "0";
	int LSB;  //  乘数的最右一位

	if (a.size() > b.size())  //  确保a短b长, a做乘数,b做被乘数.等式是b*a
		swap(a, b);
	
	int alen = a.size();
	while (true) {
		LSB = charToInt(a[alen - 1]);
		alen--;

		for (int i = 1; i <= LSB; i++)
			product = add(b, product);

		if (alen != 0)
			b += "0";
		else
			break;
	}

	return product;
}

int main() {
	int caseNum;
	string a, b;

	cin >> caseNum;

	while (caseNum--) {
		cin >> a >> b;
		cout << multiply(a, b) << endl;
	}

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值