Добавление рядов целых чисел

Я пытаюсь написать алгоритм для большего проекта, который возьмет две последовательности, которые являются оба большими целыми числами (только использующий 10 чисел цифры ради этого демонстрационного примера) и добавляют их вместе, чтобы произвести заключительную последовательность, которая точно представляет сумму этих двух исходных строк. Я понимаю, что есть потенциально лучшие способы пойти об этом с начала, но я, как предполагается, определенно использую ряды больших целых чисел в противоположность длинному целому.

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

То, где я сталкиваюсь с проблемой, я думаю, находится в подготовке к событию, на котором эти два целых числа от соответствующих положений в их последовательностях добавляют к сумме, больше, чем 9, и я тогда имел бы, переносят некоторый остаток на следующее положение. Например, если бы я имел 7 и 5 в моих положениях, которые добавили бы к 12, таким образом, я буду держать 2 и добавлять 1 к положению десятков, как только оно образовало петли назад вокруг для операции по положению десятков.

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

Надо надеяться, мой намеченный процесс четкий, и кто-то будет в состоянии указать мне в правильном направлении или исправить некоторую ошибку, которую я могу иметь в своей программе.

Заранее спасибо.

#include 
#include 
#include 

using namespace std;

int main()
{
    string str1 = "1234567890", str2 = "2345678901"; //Two original strings of large integers
    string rev_str1, rev_str2;
    int int1 = 0, int2 = 0;
    string final; //Final product string, sum of two original strings
    int temp_int = 0, buffer_int, remainder = 0;
    string temp_str = "", buffer_str;
    char buffer[100] = {0};

    cout << "str1 = " << str1 << endl;
    cout << endl;
    cout << "str2 = " << str2 << endl;
    cout << endl;

    rev_str1 = string(str1.rbegin(), str1.rend());
    rev_str2 = string(str2.rbegin(), str2.rend());

    for (int i = 0; i < 10; i++)
    {
        buffer_str = rev_str1.at(i);
        int1 = atoi(buffer_str.c_str());
        buffer_str = rev_str2.at(i);
        int2 = atoi(buffer_str.c_str());
        buffer_int += (int1 + int2 + remainder);
        remainder = 0;

        while (buffer_int > 9)
        {
            buffer_int -= 10;
            remainder += 10;
        }

        temp_str = itoa(buffer_int, buffer, 10);
        final += temp_str;
    }

    final = string(final.rbegin(), final.rend());

    cout << "final = " << final << endl;
    cout << endl;
}
3
nl ja de
Эта домашняя работа?
добавлено автор Jon Cage, источник
Устрашающе странное подобие Эйлеру № 13, isn' t это?
добавлено автор WhozCraig, источник
Сначала заставьте его работать на последовательности с нулевой длиной, затем длина 1, затем длина 2, затем отличающиеся длины, и т.д.
добавлено автор Peter Wood, источник
Несколько комментариев внедрения, не связанных с правильностью программы: Почему don' t вы используют перемену iterators непосредственно, чтобы повторить через последовательности? Кроме того, станд.:: последовательность:: в (size_t) возвращает случайную работу , который можно непосредственно сложить, если вы вычитаете ценность ' 0' , никакая потребность в промежуточном звене станд.:: последовательность и atoi() . Наконец, there' s, конечно, никакая потребность в itoa() , просто добавьте ценность ' 0' и прилагают. Наконец, вы могли предварительно ассигновать последовательность результата и также повторить по ней, самое большее это - одна цифра дольше, чем дольше входных строк.
добавлено автор Michael Wild, источник
Isn' t, что you' ре, просящее в основном внедрение BigInteger, используя массив символов?
добавлено автор Rapptz, источник

3 ответы

Вот то, что я придумал. Это только для двух summands; если у вас есть больше, необходимо будет приспособить вещи немного, в особенности с тем, чтобы нести, которое может тогда быть больше, чем 19, и способ, которым ассигнуется последовательность результата:

#include 
#include 

using namespace std;

int main()
{
   //Two original strings of large integers
    string str1 = "1234567890",
           str2 = "2345678901234";

   //Zero-padd str1 and str2 to the same length
    size_t n = max(str1.size(), str2.size());
    if (n > str1.size())
        str1 = string(n-str1.size(), '0') + str1;
    if (n > str2.size())
        str2 = string(n-str2.size(), '0') + str2;

   //Final product string, sum of two original strings.
   //The sum of two integers has at most one digit more, for more inputs make
   //below reverse_iterator a back_insert_iterator, then reverse the result
   //and skip the removal of the padding.
    string final(n+1, '0');

   //The carry
    char carry = 0;

   //Iterators
    string::const_reverse_iterator s1 = str1.rbegin(), e = str1.rend(),
                                   s2 = str2.rbegin();
    string::reverse_iterator f = final.rbegin();

   //Conversion
    for (; s1 != e; ++s1, ++s2, ++f)
    {
       //Bracketing to avoid overflow
        char tmp = (*s1-'0')+(*s2-'0') + carry;
        if (tmp > 9)
        {
            carry = 1;
            tmp -= 10;
        }
        else
        {
            carry = 0;
        }
        *f = tmp + '0';
    }
    final[0] = carry + '0';

   //Remove leading zeros from result
    n = final.find_first_not_of("0");
    if (n != string::npos)
    {
        final = final.substr(n);
    }

    cout << "str1 = " << str1 << endl
         << "str2 = " << str2 << endl
         << "final = " << final << endl;
}
6
добавлено
Спасибо, я изменил несколько вещей, но ваш алгоритм помог мне много. Я ценю его. Кроме того, это было определенно более чистым способом идти об этом, чем я имел первоначально.
добавлено автор TheNotoriousWMB, источник

Ваша проблема состоит в том, что вы несете 10-е вместо 1 с. Когда вы добавляете 19 + 5 , вы добираетесь 4 в положении единиц и добавляете дополнительный 1 в положении 10-х. Вы не добавили бы дополнительные 10 в положении 10-х.

Просто необходимо изменить эту линию: остаток + = 10; , чтобы остаток + = 1; .

Кроме того, тот , в то время как петля не необходима, если у вас есть больше чем два вторых слагаемых. Как это, когда вы добавляете только две цифры за один раз, самые большие вторые слагаемые, которые вы можете иметь, 9 + 9 , который несет только 1.

4
добавлено
@Agentlien: Если вы думаете, что одно подразделение стоит меньше чем нескольких повторений того , в то время как петля, помните что некоторая архитектура don' t даже имеют инструкцию по целочисленному делению и it' s довольно медленный на тех, которые делают. Я приветствую сравнения скорости, все же.
добавлено автор Gabe, источник
Хорошее решение.:) Крошечное разъяснение, все же. Даже с большим количеством вторых слагаемых, вы могли избежать цикла с условием продолжения, просто беря модуль суммы цифры десять, который немедленно дает вам остальных. Это - более четкий код и будет только стоить целому одному подразделению.
добавлено автор Agentlien, источник
У вас есть положительная сторона и that' s, почему я сказал, что это будет "только стоить целому одному подразделению", вместо того, чтобы предъявить претензию, о которой быстрее на практике. На архитектуре, которая действительно поддерживает инструкцию подразделения, я ожидал бы, что он будет быстрее, даже если разделение - дорогая операция. На тех, который don' t, хорошо.. Я нахожу, что версия модуля более чистый, более удобочитаемый код. Если позже вы понимаете, что это слишком медленно на практике. Ну, that' s, когда необходимо посмотреть на, для которых аппаратных средств это должно быть оптимизировано и какая версия быстрее для той конкретной архитектуры...
добавлено автор Agentlien, источник
#include

использование станд. пространства имен; главный() {

int sum =0;
int a;
int reminder;
cout<<"Enter the Number :"<>a;
while(a>0){
    reminder=a%10;
    sum=r+sum;
    a=a/10;`enter code here`

}
cout<<"Additon is :"<

}

2
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest