高精度加减法(大整数加减法)
高精度加减法是每一位oier都需要掌握的,
他们是一种工具
也是一种对我们程序实现能力(模拟)锻炼
这里介绍一下高精度加减法的原理
首先是加法
通常我们在运算时会列出如下的竖式:(这里举出“10”“9”)
可以看到,我们是按照位置对其进行运算的
在写程序中何尝不是如此呢?
同时,我们也是从最后一位往前加的
那么在存储时,我们何尝不能这么办呢?
在这里,我们可以这样办(假设都不超过1000位,la表示长度)
我们可以这样想
假设“10”是一辆卡车
再往车库“a”里倒车
“0”在“10”最后,所以在车库最里面
“1”在“0”前面,所以在倒数第二个
那么
那“10”为例
a[1000-2+0+1] = 1; …a[999] = 1
a[1000-2+1+1] = 0;…a[1000] = 0
这里需要我们自己理解一下了~~(很好理解)~~
到这里,我们遇到的新的问题便是如何处理加了
我们可以另外开一个数组用于存储
在加的时候直接进行运算便可以了
但是
进位怎么办呢?
到这里
我们便再需要一个变量来帮忙了
我们可以用一个变量记录是否有进位的情况
有进位的话,下一次再加上去,就可以了
下面给出具体的操作:
按着上面的方法来的话
前面可能会有0,所以我们要再开一个函数来去0
详细代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
int a[1009]={0},b[1009]={0},c[1009]={0};
string str1,str2;
void get() {
cin>>str1>>str2;
int la = str1.size(), lb = str2.size();
for (int i = 0; i < la; i++) a[1000-la+i+1] = str1[i] - '0';
for (int i = 0; i < lb; i++) b[1000-lb+i+1] = str2[i] - '0';
}
void tot() {
int x;
for (int i = 1000; i > 0; i--) { //倒着加,便于进位,到最后一次时可以直接加上
c[i] = a[i] + b[i] + x; //累加
x = c[i] / 10; //判断是否进位
c[i] %= 10;
if (a[i] + b[i] == 0) break; //这个要写到后面,避免最后的进位
}
}
void write() {
int h;
while (c[h] == 0) h++;
for (int i = h; i <= 1000; i++) printf("%d",c[i]);
}
int main() {
get();
tot();
write();
return 0;
}
还是dev好看QWQ
之后是减法了
根据上面的内容,这里就不多赘述了
主要说一下减法的模拟过程
在我们的手算中
两数相减存在着两种情况:借位和不借位
所以,我们也是这么处理的
用一个变量来存储是否借位
在运算时带上OK了
在借位时我们同样要减掉那个变量再加上借来的
不借位时我们直接减掉就行了
这里给出完整的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
int a[1009],b[1009],c[1009];
string str1,str2;
void get() {
cin>>str1;
cin>>str2;
int la = str1.size(), lb = str2.size();
for (int i = 0; i < la; i++) a[1000-la+i+1] = str1[i] - '0';
for (int i = 0; i < lb; i++) b[1000-lb+i+1] = str2[i] - '0';
}
void dec() {
int x = 0;
for (int i = 1000; i > 0; i--) {
if (a[i] - x >= b[i]) {
c[i] = a[i] - x - b[i];
x = 0;
}
else {
c[i] = a[i] + 10 - b[i] - x;
x = 1;
}
}
}
void write() {
int h = 0;
while (c[h] == 0) h++;
for (int i = h; i <= 1000; i++) printf("%d",c[i]);
}
int main() {
get();
dec();
write();
return 0;
}
上一篇: Java高级教程:文档注释