算法日记 高精度加法和乘法

#include <bits/stdc++.h>
using namespace std;
int x[2001], y[2001], ans[2001];//定义存数数组
int main()
{
	string a, b; cin >> a >> b;
	int la = a.size(); int lb = b.size();
	int ll = max(la, lb);//记录数的长度,和较长
	for (int i = 0; i < la; i++)
	{
		x[i] = a[i]-'0';//字符串转数组
	}
	for (int i = 0; i < lb; i++)
	{
		y[i] = b[i] - '0';
	}
	la -= 1; lb -= 1;//长度减一才是个位
	for (int i = ll-1; i >=0; i--)
	{
		ans[i] = x[la--] + y[lb--]+ans[i];//从个位加到最高位
		if (ans[i] > 9)//模拟加法
		{
			ans[i - 1]++;
			ans[i] -= 10;
		}
	}
	if (x[0] + y[0] > 9)cout << 1;//如果最高位相加大于9,先进一位
	for (int i = 0; i < ll; i++)
	{
		cout << ans[i];
	}
}

应该没啥问题,洛谷能过

改进了一下,增加了计算位数再输出

#include <bits/stdc++.h>
using namespace std;
int x[2001], y[2001], ans[2001];//定义存数数组
int main()
{
	string a, b; cin >> a >> b;
	int la = a.size(); int lb = b.size();
	int ll = max(la, lb);//记录数的长度,和较长
	for (int i = la-1; i>=0; i--)
	{
		x[la-1-i] = a[i] - '0';//字符串转数组
	}
	for (int i = lb - 1; i >= 0; i--)
	{
		y[lb-1-i] = b[i] - '0';
	}
	for (int i = 0; i <=  ll ; i++)
	{
		ans[i] = x[i] + y[i]+ans[i];//从个位加到最高位
		if (ans[i] > 9)//模拟加法
		{
			ans[i + 1]++;
			ans[i] -= 10;
		}
	}
	int ws=0;
	for (int i = 0; i <=2000; i++)
	{
		if (ans[i] != 0)ws = i;//找答案位数
	}
	for (int i = ws; i >= 0; i--)
		cout << ans[i];
}

改进之后可以改成高精度乘法,同时增加了数组位数到4000

#include <bits/stdc++.h>
using namespace std;
int x[2001], y[2001], ans[4001];//定义存数数组
int main()
{
	string a, b; cin >> a >> b;
	int la = a.size(); int lb = b.size();
	int ll = max(la, lb);//记录数的长度,和较长
	for (int i = la-1; i>=0; i--)
	{
		x[la-1-i] = a[i] - '0';//字符串转数组
	}
	for (int i = lb - 1; i >= 0; i--)
	{
		y[lb-1-i] = b[i] - '0';
	}
		for (int i = 0; i <= ll-1; i++)
		{
			for (int j = 0; j <= ll-1; j++)
			{
				ans[i + j] += x[i] * y[j];//从个位开始模拟乘法
				while (ans[i + j] > 9)
				{
					ans[i + j + 1]++;
					ans[i + j] -= 10;
				}
			}
		}
	int ws=0;
	for (int i = 0; i <=4000; i++)
	{
		if (ans[i] != 0)ws = i;//找答案位数
	}
	for (int i = ws; i >= 0; i--)
		cout << ans[i];
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值