Я пытаюсь решить эту проблему на этом онлайн-судье: 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
Как уже упоминалось @ Component10, ваш массив имеет фиксированный размер. Добавьте целое число с именем count
это увеличивается каждый раз, когда новое число выталкивается из ввода. Изменить все целочисленные литеральные ссылки на 8
в counter
,
ОБНОВЛЕНИЕ (кажется, не может оставлять комментарии по какой-то причине): я исправил это, сделав 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;
}
Если 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.
Неопределенное поведение может проявляться во многих отношениях. Ошибка во время выполнения — одна из таких возможностей.