@impelix

В чем разница 2ух кодов?

Есть 2 различных кода, их суть одна. Длинная арифметика и специфичный вывод ответа, также как и ввод. Второй код более оптимизирован по памяти.
Задача кода сложить 2 числа которые заданы в формате: Сначала идет кол-во цепочек повторяющихся цифр, потом количество цифр идущих подряд, а потом сама цифра. Например: число 111 - это 1 3 1, а число 21 это 2 1 2 1 1. Задча сложить 2 числа которые задаются таким способом и вывести ответ в таком же формате.
1ый код
#include <iostream>
#include <vector>
#include <algorithm>

struct vv{
    int c, num;
};
// Функция для сложения двух больших чисел
std::vector<int> add(const std::vector<int>& num1, const std::vector<int>& num2) {
    std::vector<int> result;
    int carry = 0;

    int i = num1.size() - 1;
    int j = num2.size() - 1;

    while (i >= 0 || j >= 0 || carry > 0) {
        int sum = carry;

        if (i >= 0) {
            sum += num1[i];
            i--;
        }

        if (j >= 0) {
            sum += num2[j];
            j--;
        }

        result.push_back(sum % 10);
        carry = sum / 10;
    }

    std::reverse(result.begin(), result.end());

    return result;
}

// Функция для вывода большого числа
void printBigNumber(const std::vector<int>& number) {
    int cnt = 0;
    std::vector<vv> kk;
    for (int k = 0; k < number.size(); ++k) {
        if (k + 1 < number.size()) {
            if (number[k] == number[k + 1]) {
                cnt++;
            } else {
                kk.push_back({cnt+1, number[k]});
                cnt = 0;
            }
        } else {
            kk.push_back({cnt+1, number[k]});
        }
    }
    std::cout << kk.size() << std::endl;
    for(auto j : kk){
        std::cout << j.c << ' ' << j.num <<'\n';
    }
}

int main() {
    int n;
    std::vector<int>num1;
    std::vector<int>num2;
    std::cin >> n;
    for(int i = 0; i < n; ++i){
        int q;
        int num;
        std::cin >> q >> num;
        for(int j =0; j < q; ++j){
            num1.push_back(num);
        }
    }
    std::cin >> n;
    for(int i = 0; i < n; ++i){
        int q;
        int num;
        std::cin >> q >> num;
        for(int j =0; j < q; ++j){
            num2.push_back(num);
        }
    }

    std::vector<int> sum = add(num1, num2);
    printBigNumber(sum);
    return 0;
}

2ой код
#include <iostream>
#include <vector>
#include <algorithm>

struct vv{
    int c, num;
};

// Функция для вывода большого числа
void printBigNumber(const std::vector<int>& number) {
    int cnt = 0;
    std::vector<vv> kk;
    for (int k = 0; k < number.size(); ++k) {
        if (k + 1 < number.size()) {
            if (number[k] == number[k + 1]) {
                cnt++;
            } else {
                kk.push_back({cnt+1, number[k]});
                cnt = 0;
            }
        } else {
            kk.push_back({cnt+1, number[k]});
        }
    }
    std::cout << kk.size() << std::endl;
    for(auto j : kk){
        std::cout << j.c << ' ' << j.num <<'\n';
    }
}

int main() {
    int n;
    std::vector<int>num1;
    std::vector<int>num2;
    std::cin >> n;
    for(int i = 0; i < n; ++i){
        int q;
        int num;
        std::cin >> q >> num;
        for(int j =0; j < q; ++j){
            num1.push_back(num);
        }
    }
    std::cin >> n;
    for(int i = 0; i < n; ++i){
        int q;
        int num;
        std::cin >> q >> num;
        for(int j =0; j < q; ++j){
            num2.push_back(num);
        }
    }

    if(num1.size() > num2.size()){
        int len = num1.size() - 1;
        for(int j = num2.size(); j > -1;j--){
            int pr = num1[len]+num2[j];
            if(pr > 9) {
                int ost = pr%10;
                num1[len] = num1[len] + ost;
                num1[len - 1]++;
            }
            else{
                num1[j] += pr;
            }
            len--;
        }
    }
    for(int h = num1.size(); h > -1; h){
        if(num1[h] > 9){
            num1[h-1]++;
            num1[h] = 0;
        }
        h--;
    }
    printBigNumber(num1);
    return 0;
}

тест
3
2 2
3 3
9 9
1
1 1
вывод:
4
2 2
2 3
1 4
9 0

Вывод у них вроде одинаков, но системе он не нравится именно у 2ого
  • Вопрос задан
  • 163 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Очевидно, что тест в системе не именно такой, как вы вводите. Код ввода и вывода в обоих кодах одинков, так что проболема в счете.

Попробуйте ввести эти же 2 длинных числа, но поменять их местами, чтобы первое было коротким. Все работает?

Сразу вижу 2 проблемы, вообще не обрабатывается случай num1.size() <= num2.size(). Во-вторых, в конце, где вы нормализуете число, если там окажется 11, где-то, то вы оставите в этом разряде 0, а не 1, как надо. Правда, при сумме двух чисел там 11 получится за длиной максимального числа не может появиться, ибо туда может прийти только +1 от переноса. Но код все-равно логически неверен.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы