Я хочу изменить условие, но не могу - PullRequest
0 голосов
/ 23 апреля 2020

Проблема: детей учат добавлять мульти-числа git справа налево, по одному ди git за раз. Многие находят, что операция «перенос», где 1 переносится из одной позиции di git в другую, является серьезной проблемой. Ваша задача состоит в том, чтобы подсчитать количество операций переноса для каждой из множества задач сложения, чтобы преподаватели могли оценить их сложность.

Ввод: каждая строка ввода содержит два беззнаковых целых числа меньше 10 цифр. Последняя строка ввода содержит «0» 0.

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

Это оригинал код, который удовлетворяет вводам, которые меньше 10 цифр

#include <iostream>
#include <cstdio>
#include <cstdlib>

int main(void){
unsigned int n1, n2, remain_n1, remain_n2, carry;

while(1)
{
    std::cin >> n1 >> n2;

    if(n1 == 0 && n2 == 0)
        break;

    int carry = 0;
    int count = 0;
    int sum = 0;

    while(n1 != 0 || n2 != 0)
    {
        remain_n1 = n1 % 10;        
        remain_n2 = n2 % 10;         

        if(carry == 1)             
            remain_n1++;          


        sum = remain_n1 + remain_n2;       
        carry = 0;

        if(sum >= 10){                     
            carry = carry + 1;                         
            count = count + 1;                       
        }

        n1 = n1 / 10;                          
        n2 = n2 / 10;                              

    }

    if(count == 0)
        std::cout << "No carry operation." << std::endl;
    else if(count == 1)
        std::cout << count << " " << "carry operation" << std::endl;
    else
        std::cout << count << " " << "carry operations" << std::endl;
}
return 0;
}

В проблемном вводе написано менее 10 цифр, но я хочу изменить его, чтобы он удовлетворял условию независимо от того, что вводится. И это мой код. Как мне это исправить?

 std:;string n1, n2;
 while(1){
 std:;cint >> n1 >> n2;
 if(n1 == "0" && n2 == "0")
       break;

 int max_len = n1.szie();
 if (max_len < n2.size())
     max_len = n2.size();

 int nn1[max_len] - {0);
 int nn2[max_len] = {0};

 for(int i = 0; i < n1.size(); i++)
       nn1[max_len - n1.size() + i]; = n1[i] - '0'; 
 }

1 Ответ

1 голос
/ 23 апреля 2020

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

Примерно так, возможно:

std::cin >> a >> b;

int carry = 0;
int count = 0;

// Iterate in reverse.
for (auto ia = a.rbegin(), ib = b.rbegin(); ia != a.rend() && ib != b.rend(); ++ia, ++ib)
{
    int sum = (*ia - '0') + (*ib - '0') + carry;
    carry = sum >= 10;
    count += carry;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...