Вычитание двух длинных положительных целых чисел из массива c ++

Я относительно новичок в программировании :).

Предположим, я хотел создать программу, которая предлагает пользователю ввести два положительных числа длиной до 50 цифр, которые затем вычитают второе число из первого числа.

Например:

Пользователь вводит первое положительное число: 239834095803945862440385983452184985298358

второй номер: 939542309853120721934217021372984729812

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

Программа выводит разницу: 238894553494092741718901766430812000568564

ИЛИ, если отрицательное: -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. Написание собственной программы для долгого вычитания чисел

и т.д...

Однако вывод будет успешным ТОЛЬКО до определенного количества цифр и / или если они положительные / отрицательные числа. Я в тупике и не уверен, как лучше всего вычесть два массива положительных чисел, чтобы получить успешный результат, который может учитывать положительные и отрицательные числа, как показано в примере. ЛЮБАЯ ПОМОЩЬ БЛАГОДАРЮ :).

РЕДАКТИРОВАТЬ: мои попытки:

#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];
}

person Mark    schedule 14.02.2013    source источник
comment
Попробуйте решить это за 8-9, затем за 27-46. Должен заставить тебя идти.   -  person Peter Wood    schedule 14.02.2013
comment
Как бы вы выполняли вычитание карандашом и бумагой? Это ваш алгоритм.   -  person Raymond Chen    schedule 14.02.2013
comment
Я думаю, вам стоит поделиться некоторыми из ваших попыток, которые не помогли получить дополнительную помощь (я имею в виду код)   -  person Hayri Uğur Koltuk    schedule 14.02.2013
comment
Если это был дубликат, прошу прощения, я тщательно поискал перед публикацией!   -  person Mark    schedule 14.02.2013
comment
Я не думаю, что ваша математика должна использовать пресс.   -  person Mats Petersson    schedule 14.02.2013
comment
stringstream::clear не очищает его от содержимого, он очищает биты ошибок. Чтобы сделать его пустым, используйте ss.str("");   -  person Peter Wood    schedule 14.02.2013
comment
Практически то же самое, что и stackoverflow.com/questions/14576411/adding-strings -of-целых чисел   -  person Michael Wild    schedule 14.02.2013
comment
r[sizes] переполнит буфер.   -  person Peter Wood    schedule 14.02.2013


Ответы (1)


Так что решение этой проблемы почти такое же, как если бы вы делали это вручную.

Если у нас есть:

 4321
-1234

Вы берете последние цифры в двух числах, вычитаете одну, расположенную ниже, из числа выше, 1 - 4 - что, конечно, означает, что вам нужно брать взаймы со следующей цифры вверх, поэтому мы запоминаем это, а затем получаем 7. Теперь , возьмите следующую цифру [и запомните «заимствовать»] и вычтите 3 из 2-1 = 8.

Точно так же вы выполняете вычитание больших чисел на компьютере - делайте по одному элементу за раз, и если вы «одалживаете», то вам нужно взять это с собой на следующий шаг.

person Mats Petersson    schedule 14.02.2013
comment
Спасибо за ваш быстрый ответ :). Я действительно написал программу, которая это сделала. Это сработало до определенного момента. Однако он застрял на нулях и заимствовал из нулей ... однако мне просто пришло в голову, что у меня не было ничего, чтобы отслеживать длину числа, я попытаюсь включить это и посмотреть, продолжает ли он давать мне изворотливый вывод :) - person Mark; 14.02.2013
comment
Конечно, если работать с длинными числами цифра за цифрой утомительно, вы всегда можете обработать, скажем, группы из 3 цифр (считая от младшей значащей цифры) и выполнить арифметические действия с ними, не забывая о переносах. - person High Performance Mark; 14.02.2013
comment
Я добавил пример своего длинного кода вычитания, чтобы вы могли разорвать его на части на досуге, ха-ха :). - person Mark; 14.02.2013