高精度加減法是每一位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;
}