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

Я пытаюсь решить эту проблему на этом онлайн-судье: 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

2

Решение

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

1

Другие решения

ОБНОВЛЕНИЕ (кажется, не может оставлять комментарии по какой-то причине): я исправил это, сделав 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;
}
1

Если 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.

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

0
По вопросам рекламы [email protected]