高精度算法
前言
不得不说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</