一、實驗目的
使用C++實現大數的加減
二、實驗環境
GCC 4.9.2
三、實驗過程
3.1 大數加法
例1: 無進位情況
string a = “12345” , string b = “789”
利用數組逆序存儲兩個數字,來求和與進位
圖示:
求和結果爲13134
例2:有進位情況
string a = “99769” , string b = “231”
實現代碼
//大數加法
string addNum(string a, string b) {
int xa[500] = {};
int xb[500] = {};
int tot[500] = {};
for (int i = 0, size = a.size(); i < size; i++) {
//逆序存儲a
xa[i] = a[size - i - 1] - '0';
}
for (int i = 0, size = b.size(); i < size; i++) {
xb[i] = b[size - i - 1] - '0';
}
int len = max(a.size(), b.size());
for (int i = 0; i < len; i++) {
tot[i] += (xa[i] + xb[i]);
//處理進位
if (tot[i] > 9) {
tot[i + 1] += 1;
tot[i] -= 10;
}
}
//保存結果
string res = "";
//判斷有無進位的情況
if (tot[len]) {
res += (tot[len]+'0');
}
for (int i = len - 1; i >= 0; i--) {
res += (tot[i]+'0');
}
return res;
}
運行結果
3.2 大數減法
例3:非負情況
string a = “99729” , string b = “99231”
運算時確保被減數大於減數,最後判斷是否爲負數
//大數減法,a爲被減數,b爲減數
string subNum(string a, string b) {
int xa[500] = {};
int xb[500] = {};
int tot[500] = {};
for (int i = 0, size = a.size(); i < size; i++) {
//逆序存儲a
xa[i] = a[size - i - 1] - '0';
}
for (int i = 0, size = b.size(); i < size; i++) {
xb[i] = b[size - i - 1] - '0';
}
int len = max(a.size(), b.size());
for (int i = 0; i < len; i++) {
if(xa[i] < xb[i]){
tot[i] -= 1;
xa[i] += 10;
}
tot[i] += (xa[i] - xb[i]);
}
string res = "";
//找到第一個非0的位置,消除前導0
int index = len - 1;
while(index >= 0 && tot[index] == 0){
index--;
}
//處理相減結果爲0的情況
if(index < 0 ){
index = 0;
}
for(int i = index ; i>=0 ;i--){
res += (tot[i] + '0');
}
return res;
}
運行結果