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

高精度加减法是每一位oier都需要掌握的,
他们是一种工具
也是一种对我们程序实现能力(模拟)锻炼

这里介绍一下高精度加减法的原理
首先是加法
通常我们在运算时会列出如下的竖式:(这里举出“10”“9”)
高精度加减法(大整数加减法)_第1张图片
可以看到,我们是按照位置对其进行运算的
在写程序中何尝不是如此呢?
同时,我们也是从最后一位往前加的
那么在存储时,我们何尝不能这么办呢?
在这里,我们可以这样办(假设都不超过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
这里需要我们自己理解一下了~~(很好理解)~~

到这里,我们遇到的新的问题便是如何处理加了
我们可以另外开一个数组用于存储
在加的时候直接进行运算便可以了
但是
进位怎么办呢?
到这里
我们便再需要一个变量来帮忙了
我们可以用一个变量记录是否有进位的情况
有进位的话,下一次再加上去,就可以了
下面给出具体的操作:
高精度加减法(大整数加减法)_第2张图片
按着上面的方法来的话
前面可能会有0,所以我们要再开一个函数来去0

详细代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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;
}

你可能感兴趣的:(基础题,模拟)