Краткий ответ: Ошибка сегментации вызвана char l[10000000];
. Декалирование char l[26];
достаточно.
Детали
Как уже говорили другие, распределение char l[10000000];
вызывает ошибку сегментации. Вам не нужно так много памяти. В вопросе говорилось, что максимальное значение для n
составляет 10 ^ 18. Таким образом, максимальная длина слова будет 26 символов. Таким образом, char l[26];
достаточно.
Объяснение: Имеется 10 или 18 вариантов размещения символов k
. У каждого персонажа есть 5 опций, и поэтому количество опций для размещения этих символов составляет 5^k
Теперь вам просто нужно найти k
:
5^k = 10^18 ==> k = log_5(10^18) ~= 25.75218 < 26
Осуществление
Что касается реализации, у вас есть несколько неправильных вещей.
- Вы не устанавливаете
i = 0;
после каждого входного сканирования.
- Вы не можете использовать strlen без завершающего нулевого символа. Вы должны добавить
l[i] = '\0';
выше p = strlen(l);
.
- Ваш второй цикл for, который должен возвращать строку, не работает должным образом. Каждый шаг изменяет строку и шаги после нее используют измененную строку (вместо работы с исходной).
Что касается алгоритма, он также не работает должным образом. Я могу дать вам подсказку: эта проблема похожа на подсчет в base-5 .
Комментарии
Все вышесказанное - это всего лишь несколько вещей, которые я заметил. Я думаю, вам следует подумать о переписывании кода, поскольку он все еще может содержать небольшие недостатки.
Еще один совет: для печати строк (символьных массивов в c) вы можете использовать
printf("%s", str);
Предполагая, что str
является массивом символов, который заканчивается завершающим нулевым символом. Еще немного информации здесь .