高精度算法(加减乘除取模(均可以处理负数))

前言

不得不说csdn上面的文章是越来越乱了,搞的想骂人的那种。本文在这里声明,这是一篇模板的博客,如果向更深入的了解(会提及一些)可以去参考别的文章。没一个模板都经过博主简化和模块化已达到易写的目的。

大数加法

不可以处理负数的模板

// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
   
    if (A.size() < B.size()) return add(B, A);

    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i ++ )
    {
   
        t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }

    if (t) C.push_back(t);
    return C;
}

可以处理负数

因为减法就是带负数的加法,因此我们在处理负数的时候一般是对负数的情况进行讨论

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
char a[1000005];
char b[1000005];
int fa, fb;
int la, lb;

void show(int ed) {
   
	if (fa)
		printf("-");
	for (int i = ed; i >= fa; --i)
		printf("%d", a[i]);
}

// 两个都为负数或者两个都不是负数的情况
void add() {
   
	int i, j, t = 0, s, l;
	for (i = fa; i < la || i < lb; ++i) {
   
		s = a[i]  + b[i]   + t;
		t = s / 10;
		a[i] = s % 10;
	}
	a[i] = t ;
	l = t ? i : i - 1;//t是进位 ,如果最后进位了,这l为i,否则只到i-1
	show(l);
}

//比较大小
int cmp() {
   
	int la = strlen(a), lb = strlen(b);
	if (la - fa > lb - fb) // 比较长度
		return 1;
	else if (la - fa < lb - fb)
		return 0;
	else {
   
		// 长度相等则看每一位
		int i ;
		for ( i = 0; i < la && a[i + fa] == b[i + fb]; ++i);
		return a[i + fa] > b[i + fb];
	}
}

void minu() {
   
	//两个符号不一样的话是利用减法
	int i, j, c = 0, l = -1, s;
	for (i = 0; i + fa < la; ++i) {
   
		s = a[i + fa] - b[i + fb] - c >= 0 ? 0 : 1; //是否需要借位
		a[i + fa] = (10 + a[i + fa] - b[i + fb] - c) % 10;
		l = a[i + fa] ? i + fa : l; //判断末尾位置
		c = s;
	}
	if (l < 0)
		printf("0");
	else
		show(l);
}

int main() {
   
	scanf("%s%s", a, b);
	fa = ('-' == a[0]), fb = ('-' == b[0]);
	// 我们早两者如果只有一个负数的时候,我们让前一个数大的原因是这样我们就可以通过前一个确实整个的符号
	if ( !cmp())
		swap(a, b), swap(fa, fb);
	la = strlen(a), lb = strlen(b);
	reverse(a + fa, a + la), reverse(b + fb, b + lb); // 易忘
	int i = fa, j = fb;
	while (i < la)
		a[i] -= '0', i ++;
	while (j < lb)
		b[j] -= '0', j ++;//j容易写成i
	if (fa ^ fb)
		minu(); // 两个只有有一个有负号 ,减法
	else
		add(); // 加法
	return 0;
}

大数减法

两个数都是整数,且相减结果大于0

// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
   
    vector<int> C;
    for (int i = 0, t = 0; i < A.size(); i ++ )
    {
   
        t = A[i] - t;
        if</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

落春只在无意间

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

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

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

打赏作者

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

抵扣说明:

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

余额充值