1. 程式人生 > >大整數加減法c/c++實現

大整數加減法c/c++實現

大整數加法

# include <iostream>
using namespace std;
template<typename T>
int count(T& x)
{
    int s1 = sizeof(x);
    int s2 = sizeof(x[0]);
    int result = s1 / s2;
    return result;
}
void add(int a[],int b[],int alength,int blength) {
    int *p;
    int m = 0;
    int n = 0;
    int flag = 0;
    //在初始分配結果p陣列長度多與最長長度儲存進位
    if (alength >= blength) {
        p = new int[alength + 1]{ 0 };
        m = blength;
        n = alength + 1;
    }
    else {
        p = new int[blength + 1]{ 0 };
        m = alength;
        n = blength + 1;
    }
    //同有位置的加法
    for (int i = 0; i < m; i++) {
        p[i] = (a[i] + b[i] + flag)%10;
        flag = (a[i] + b[i] + flag) / 10;
    }
    //多餘位置的加法
    if (alength >=blength) {
        for (int i = m; i < alength ; i++) {
            p[i] = (a[i] + flag) % 10;
            flag = (a[i] + flag) / 10;
        }
        if (flag != 0) {
            p[alength] = flag;
            cout << "結果長度:" << (alength + 1) << endl;
            for (int i = 0; i < alength + 1; i++)
                cout << p[i] << " ";
        }
        else {
            cout << "結果長度:" << alength << endl;
            for (int i = 0; i < alength ; i++)
                cout << p[i] << " ";
        }

    }
    if (blength > alength) {
        for (int i = m; i < blength; i++) {
            p[i] = (b[i] + flag) % 10;
            flag = (b[i] + flag) / 10;
        }
        if (flag != 0) {
            p[blength] = flag;
            cout << "結果長度:" << (blength + 1) << endl;
            for (int i = 0; i < blength + 1; i++)
                cout << p[i] << " ";
        }
        else {
            cout << "結果長度:" << blength << endl;
            for (int i = 0; i < blength; i++)
                cout << p[i] << " ";
        }

大整數減法

# include <iostream>
using namespace std;
template<typename T>
int count(T& x)
{
    int s1 = sizeof(x);
    int s2 = sizeof(x[0]);
    int result = s1 / s2;
    return result;
}
void reduce(int a[], int b[], int alength, int blength) {
    
    int m = 0;
    int n = 0;
    int length = 0;
    int *p = new int[alength]{ 0 };
    length = alength;
    m = blength;
    for (int i = 0; i <blength; i++) {
        if (a[i] >= b[i])
            p[i] = a[i] - b[i];
            
        else {
            n = i;
            //實現連環借位方法
            while (1) {
                if (a[i + 1] != 0) {
                    a[i + 1] = a[i + 1] - 1;
                    break;
                }
                else {
                    a[i + 1] = 9;
                    i = i + 1;
                }

            }
            i = n;
            p[i] = 10 - b[i] + a[i];
        }
        
    }
    //解決a陣列多出來部分賦值問題,並第一次次排除頭為0的問題
    for (int i = alength-1; i >=blength; i--) {
            if (a[i] != 0) {
                p[i] = a[i];
                break;
            }
            else
                length--;
        
        }
        for (int i = blength; i < length-1; i++) {
            p[i] = a[i];
        }
        //第二次徹底解決頭為0的問題出現低二次原因是第一次在解決頭出現問題僅僅解決的是a陣列賦值有0情況。
        for (int i = length-1; i >= 0; i--) {
            if (p[i] == 0)
                length--;
            else
                break;
        }
            
            cout << "結果長度:" << length << endl;
            for (int i = 0; i < length ; i++)
                cout << p[i] << " ";
            delete[]p;
            delete p;

    }
    
    


void main() {
    int alength = 0;
    int blength = 0;
    int *a;
    int *b;
    cout << "輸入長度alength:";
    cin >> alength;
    a = new int[alength] {0};
    for (int i = 0; i < alength; i++) {
        cin >> a[i];
    }
    cout << "輸入長度blength:";
    cin >> blength;
    b = new int[blength] {0};
    for (int i = 0; i < blength; i++) {
        cin >> b[i];
    }
    reduce(a, b, alength, blength);
    delete[]a;
    delete[]b;
    delete a;
    delete b;
}

        
    }
    delete []p;
    delete p;
}

void main() {
    int alength = 0;
    int blength = 0;
    int *a;
    int *b;
    cout << "輸入長度alength:";
    cin >> alength;
    a = new int[alength] {0};
    for (int i = 0; i < alength; i++) {
        cin >> a[i];
    }
    cout << "輸入長度blength:";
    cin >> blength;
    b = new int[blength] {0};
    for (int i = 0; i < blength; i++) {
        cin >> b[i];
    }
    add(a, b, alength, blength);
    delete[]a;
    delete[]b;
    delete a;
    delete b;
}