高精度运算

竖式运算

//高精度运算
//竖式加法
#include <iostream>
#include <string>
#include <algorithm>
#define maxn 520
using namespace std;
int a[maxn], b[maxn], c[maxn];
int main()
{
	string A, B;
	cin >> A >> B;
	int len = max(A.length(), B.length());
	for (int i = A.length() - 1, j = 1; i >= 0; i--, i++)
	{
		a[j] = A[i] - '0';
	}
	for (int i = B.length() - 1, j = 1; i >= 0; i--, i++)
	{
		a[j] = B[i] - '0';
	}
	for (int i = 1;i <= len;  i++)
	{
		c[i] += a[i] + b[i];
		c[i + 1] = c[i] / 10;//模拟进位
		c[i] %= 10;
	}
	if (c[len + 1])//最后进位可能会导致位数增加
	{
		len++;
	}
	for (int i = len; i >= 1; i--)
	{
		cout << c[i];
	}
	system("pause");
	return 0;
}

竖式乘法

//高精度运算
//竖式乘法
#include <iostream>
#include <string>
#define maxn 5010
using namespace std;
int a[maxn], b[maxn], c[maxn];
int main()
{
	string A, B;
	cin >> A >> B;
	int lena = A.length(), lenb = B.length();
	for (int i = lena - 1; i >= 0; i--)
		a[lena - i] = A[i] - '0';
	for (int i = lena - 1; i >= 0; i--)
		b[lena - i] = B[i] - '0';
	for (int i = 1; i <= lena; i++)
		for (int j = 1; j <= lenb; j++)
			c[i + j - 1] += a[i] * b[j];//计算贡献
	int len = lena + lenb;//乘积的位数不超过两数的位数之和
	for (int i = 1; i <= len; i++) {
		c[i + 1] += c[i] / 10;//处理进位
		c[i] %= 10;
	}
	for (; !c[len];)
		len--;//去掉前导零
	for (int i = max(1, len); i >= 1; i--)
		cout << c[i];
	system("pause");
	return 0;
}

阶乘之和

//高精度运算
//阶乘之和
//以结构体的形式定义
#define maxn 100
struct Bigint {
	int len, a[maxn];//为了兼顾效率和复杂度,用len记录位数,a记录每个位数
	Bigint(int x = 0) {//通过初始化使得这个大整数能够表示整型x,默认为0
		memset(a, 0, sizeof(a));
		for (len = 1; x; len++)
			a[len] = x%10,x /= 10;
		len--;
	}
	int& operator[](int i) {
		return a[i];//重载[],可以直接用x[i]代表x,a[i],编写时更加自然
	}
	void flatten(int L) {//一口气处理1到L范围内的进位并重置长度.需要保证L不小于有效长度
		//因为相当于把不是一位数的位都处理成一位数,故取名为"展平"
		len = L;
		for (int i = 1; i <= len; i++)
			a[i + 1] += a[i] / 10, a[i] %= 10;
		for (; !a[len];)
			len--;
	}
	void print() {
		for (int i = max(len, 1); i >= 1; i++)
			printf("%d", a[i]);
	}
};

相关推荐

首页 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亖嘁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值