Программа работает в компиляторе, но возвращает ошибку времени выполнения в онлайн-судье

Я пытаюсь решить эту проблему на этом онлайн-судье: https://a2oj.com/ladder?ID=3 (см. Проблему ниже), используя следующий код. Он успешно работает на компиляторе, но возвращает ошибку во время выполнения на онлайн-судье.

РЕДАКТИРОВАТЬ: код после изменения условий цикла

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

struct count {
    int number;
    int repetitions;
};

bool sortByNumber(const struct count &lhs, const struct count &rhs) { 
    return lhs.number < rhs.number;
}

int main() {
    vector <int> input;
    int n = 0;
    do {
        cin>>n;
        input.push_back(n);
    } while (n != 0);

    struct count x[101] = {NULL};

    for (int j = 0; j < input.size(); j++) {
        int tracker = 0;
        for (int z = 0; z < input.size(); z++) {
            if (input[j] != x[z].number) {
                tracker++;
            }
        }
        if (tracker == input.size()) {
            x[j].number = input[j];
        }
    }

    sort(x, x+101, sortByNumber);

    for (int y = 0; y < 101; y++) {
        for (int w = 0; w < input.size(); w++) {
            if (x[y].number == input[w]) {
                x[y].repetitions++;
            }
        }
    }

    for (int v = 0; v < 101; v++) {
        if (x[v].number != 0) {
            cout << x[v].number << " " << x[v].repetitions << endl;
        }
    }

    return 0;
}

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

РЕДАКТИРОВАТЬ: Проблема Постановка проблемы: Амгад получил работу кассира в большом магазине, где он получает тысячи долларов каждый день. Как кассир, он должен считать сумму каждой долларовой банкноты (банкноты), которую он имеет в конце каждого дня.

Amgad хочет, чтобы вы помогли ему, написав компьютерную программу, чтобы Amgad мог просто ввести сумму каждого счета, и вы будете считать каждый счет отдельно.

Формат ввода: одно или несколько положительных чисел, оканчивающихся на ноль, каждое число от 1 до 100 включительно

Формат вывода: печатать каждое число только один раз в одной строке с последующим количеством повторений

Пример ввода: 100 20 5 2 10 20 5 5 20 100 10 2 2 10 5 0

Пример вывода: 2 3 5 4 10 3 20 3 100 2

3 ответа

ОБНОВЛЕНИЕ (кажется, не может оставлять комментарии по какой-то причине): я исправил это, сделав x переменной длины и инициализация его с помощью цикла. Теперь нет ошибок во время выполнения, но, очевидно, это занимает слишком много времени. Любые идеи о том, как сократить время, будут очень благодарны!

ОБНОВЛЕННЫЙ КОД:

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

struct count {
    int number;
    int repetitions;
};

bool sortByNumber(const struct count &lhs, const struct count &rhs) { 
    return lhs.number < rhs.number;
}

int main() {
    vector <int> input;
    int n = 0;
    do {
        cin>>n;
        input.push_back(n);
    } while (n != 0);

    struct count x[input.size()];

    int u = 0;

    do {
        x[u].number = 0;
        x[u].repetitions = 0;
        u++;
    }  while ((x[u].number != 0) && (x[u].repetitions != 0));

    for (int j = 0; j < input.size(); j++) {
        int tracker = 0;
        for (int z = 0; z < input.size(); z++) {
            if (input[j] != x[z].number) {
                tracker++;
            }
        }
        if (tracker == input.size()) {
            x[j].number = input[j];
        }
    }

    sort(x, x+input.size(), sortByNumber);

    int structSize = sizeof(x) / sizeof(x[0]);

    for (int y = 0; y < structSize; y++) {
        for (int w = 0; w < input.size(); w++) {
            if (x[y].number == input[w]) {
                x[y].repetitions++;
            }
        }
    }


    for (int v = 0; v < structSize; v++) {
        if ((x[v].number > 0) && (x[v].repetitions > 0)) {
            cout << x[v].number << " " << x[v].repetitions << endl;
        }
    }

    return 0;
}

Как уже упоминалось @Component10, ваш массив имеет фиксированный размер. Добавьте целое число с именем count это увеличивается каждый раз, когда новое число выталкивается из ввода. Изменить все целочисленные литеральные ссылки на 8 в counter,

Если input содержит более 101 элемента, условия

if (tracker == 8) {
    x[j].number = input[j];
}

а также

if (input[j] != x[z].number) {
    tracker++;
}

Вызывает неопределенное поведение для любого j значение выше 100, из-за выхода за пределы массива x элементы. И то и другое z, а также j зациклены на input.size(), который может быть выше 101.

Неопределенное поведение может проявляться во многих отношениях. Ошибка во время выполнения - одна из таких возможностей.

Другие вопросы по тегам