在数组c ++中减去两个长正整数

时间:2013-02-14 13:01:14

标签: c++ arrays math subtraction

我对编程比较陌生:)。

假设我想创建一个程序,提示用户输入最多50位数的两个正数,然后从第一个数字中减去第二个数字。

例如:

用户输入第一个正数: 239834095803945862440385983452184985298358

第二个号码: 939542309853120721934217021372984729812

=============================================== ============================

计划输出差异: 238894553494092741718901766430812000568564

OR,如果否定: -29837430045

=============================================== ============================

数字的每个数字将作为单个元素存储在数组中。以下是我目前正在接受用户输入的方式:

int read_array(int int_array[], int MAX_SIZE) {
    char number;
    int count = 0;
    //set all array entries to 0. 
    for (int i = 0; i < MAX_SIZE; i++){
        int_array[i] = 0;
    }

    do { //processes each individual char in the istream
        cin.get(number);
        // puts char on to the array until it hits the
        // end of the number (end of the line)
        if(( number != '\n') && (count < MAX_SIZE) && (isdigit(number))) {
            int_array[count] = int(number) - int('0');
        }  
        count++; //increments count
    } while (number != '\n');

    //tests if number is too large
    int digitcount = count - 1;
    if (digitcount > MAX_SIZE) {
        cout << endl << "ERROR: The number is above 50 digits!" << endl;
        return 0;
    }

问题:

如何做减法是我的意思。我一直试图解决这个问题两个星期,这很可能是我错过了一些微不足道的事情。

我试过了:

  1. 将元素数组转换回一个整数int
  2. 编写我自己的程序,对数字进行长时间的减法
  3. 等...

    然而,输出仅在一定数量的数字和/或它们是正数/负数时才成功。我很难过,我不确定最好的方法是减去两个正数数组,以获得一个能够容纳正数和负数的成功输出,如示例所示。任何帮助都非常赞赏:)。

    编辑:我的尝试:

    #include "long_sub.h"
    #include <sstream>
    #include <vector>
    
    using namespace std;
    
    int long_sub(int a[], int b[], const int size) {
        stringstream ss;
        int const sizes = 50;
        int c = 0; //borrow number
        int borrow = 1; // the '1' that gets carried to the borrowed number
        int r[sizes];
    
        for (int i = 0; i < size; i++) {
            r[i] = 0;
        }    
        //initialise answer array to 0.
        for (int i = size - 1; i >= 0; i--) {
            //handles zeros
            if (a[i] < b[i] && a[i]) {
                //takes the borrow from the next unit and appends to a.
                ss << borrow << a[i];
                ss >> c;
                ss.clear(); // clears stringstream for next potential borrow.
    
                int temp = c - b[i];
                r[i] = abs(temp);
            } else {
                int temp = a[i] - b[i];
                r[i] = abs(temp);
            }
        }
    
        for (int i = 0; i <= size - 1; i++ ) {
            cout << r[i];
        }
        cout << endl;
        return r[sizes];
    }
    

1 个答案:

答案 0 :(得分:4)

所以解决这个问题与你手工完成的解决方案几乎相同。

如果我们有:

 4321
-1234

你取两个数字中的最后一个数字,从上面的数字中减去下面的一个数字,1 - 4 - 这当然意味着你必须从下一个数字中借来,所以我们记住了,然后拿出7.现在,取下一个数字[并记住“借用”],并从2-1 = 8中减去3。

完全相同的是你如何对计算机中的大数字进行减法 - 一次做一次,如果你“借”,那么你需要把它带到下一步。