高精度加減法(大整數加減法)

高精度加減法是每一位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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章