欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

高精度加减法(大整数加减法)

程序员文章站 2022-06-02 20:29:37
...

高精度加减法是每一位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;
}
相关标签: 高精度