學弟講算法·大數加減

一、實驗目的

使用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;
}

運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章