Первые три теста проходит, четвёртый - неверный ответ. И фиг знает что именно за тест. Перепроверил код много раз, исправил косяки и недочёты, которые заметил, но безуспешно.
Задача:
https://acmp.ru/asp/do/index.asp?main=task&id_course=3&id_section=26&id_topic=225&id_problem=1467&ins=1#solution
Моё решение:
https://dropmefiles.com/zarIa (там кнопка "скачать" и текстовый файл с моим кодом)
Не вижу, что именно был за тест и из-за этого не могу исправить код.
Python
Сижу уже час, не пойму где ошибка в коде. Задача с acmp.ru
Прогони тесты на этом:
Я попробовал найти следующий юбилей для 999 999 999 999 лет с 50-ю нулями, отрабатывает за секунду (перебирает основания системы счисления до корня L-й степени из (X + 1) + 1, чтобы набрать нужное количество нулей).
Для сравнения, все варианты от нейросети в первом ответе даже на меньших данных задумываются на целую вечность, ответа не дождёшься.
Да, и возню с файлом сам приделай, у меня - только алгоритм.
Хотя, ладно, там дел на 1 мин:
x, l = (int(s) for s in input().split())
j = min(x + n - (x + n) % n for r in range(2, int((x + 1) ** (1./l)) + 2) for n in (r ** l,))
print(j)
Я попробовал найти следующий юбилей для 999 999 999 999 лет с 50-ю нулями, отрабатывает за секунду (перебирает основания системы счисления до корня L-й степени из (X + 1) + 1, чтобы набрать нужное количество нулей).
Для сравнения, все варианты от нейросети в первом ответе даже на меньших данных задумываются на целую вечность, ответа не дождёшься.
Да, и возню с файлом сам приделай, у меня - только алгоритм.
Хотя, ладно, там дел на 1 мин:
with open("input.txt", 'r') as f:
x, l = (int(s) for s in next(f).split())
j = min(x + n - (x + n) % n for r in range(2, int((x + 1) ** (1./l)) + 2) for n in (r ** l,))
print(j)
Олег Фролов
Runtime error на третьем тесте оба кода выбивают
скинь на pastebin.com , у меня эта помойка не пашет
Дмитрий Классен
Ты правда хочешь увидеть его неработающую поделку? Смысл?
Проблема возникает из-за того, что ваш алгоритм пытается перебрать все возможные значения числа от X до 9^99 и основания системы счисления от 2 до 36. Это очень неэффективно и может привести к чрезмерному использованию ресурсов, что, вероятно, и вызывает ошибку в задаче.
Что касается оптимизации вашего алгоритма, есть несколько способов улучшить его:
1. Вместо перебора чисел от X до 9^99 можно использовать бинарный поиск, чтобы найти минимальное число, у которого юбилейность хотя бы L. Это значительно сократит количество итераций.
2. Вместо того, чтобы переводить число во все возможные системы счисления и смотреть количество нулей в конце, можно переводить число только в системы счисления, которые могут дать желаемую юбилейность. Например, если L равно 8, то нет смысла переводить число в систему счисления с основанием 3, потому что такая система не может дать 8 нулей в конце. Можно ограничиться основаниями, которые являются степенями двойки, и это также ускорит алгоритм.
3. Вместо того, чтобы переводить число в строку и считать количество нулей в конце, можно использовать арифметику остатков. В отличие от работы со строками, арифметика остатков позволяет делать эти вычисления в числовой форме, что ускоряет процесс.
4. Tакже предлагаю вам взглянуть на другой подход к решению этой задачи. Фактически, юбилейность числа равна максимальной степени двойки, на которую делится это число. Следовательно, вместо перевода числа в разные системы счисления для определения юбилейности, можно напрямую работать с этими степенями. Это будет намного быстрее.
Успеха в решении этой задачи!
Что касается оптимизации вашего алгоритма, есть несколько способов улучшить его:
1. Вместо перебора чисел от X до 9^99 можно использовать бинарный поиск, чтобы найти минимальное число, у которого юбилейность хотя бы L. Это значительно сократит количество итераций.
2. Вместо того, чтобы переводить число во все возможные системы счисления и смотреть количество нулей в конце, можно переводить число только в системы счисления, которые могут дать желаемую юбилейность. Например, если L равно 8, то нет смысла переводить число в систему счисления с основанием 3, потому что такая система не может дать 8 нулей в конце. Можно ограничиться основаниями, которые являются степенями двойки, и это также ускорит алгоритм.
3. Вместо того, чтобы переводить число в строку и считать количество нулей в конце, можно использовать арифметику остатков. В отличие от работы со строками, арифметика остатков позволяет делать эти вычисления в числовой форме, что ускоряет процесс.
4. Tакже предлагаю вам взглянуть на другой подход к решению этой задачи. Фактически, юбилейность числа равна максимальной степени двойки, на которую делится это число. Следовательно, вместо перевода числа в разные системы счисления для определения юбилейности, можно напрямую работать с этими степенями. Это будет намного быстрее.
Успеха в решении этой задачи!
def jubileyness(n):
max_zeros = 0
for B in range(2, int(n**0.5) + 2): # перебор возможных оснований систем счисления
zeros = 0
temp = n
while temp % B == 0:
zeros += 1
temp //= B
max_zeros = max(max_zeros, zeros)
return max_zeros
X, L = map(int, input().split()) # чтение входных данных
current_age = X
while True: # перебор возможных возрастов
current_age += 1
if jubileyness(current_age) >= L:
print(current_age)
break
Дмитрий Классен
Сколько лет ждать, пока посчитает для триллиона?
К сожалению, я не могу открыть ваши предоставленные ссылки или пользоваться сервисом acmp.ru . Однако, я могу объяснить, как вы можете найти ошибку в своем коде.
1. Проверьте входные данные: Убедитесь, что вы правильно интерпретируете исходное условие и правильно обрабатываете входные данные. Проверьте, что вы верно читаете и обрабатываете входные значения с клавиатуры или файла.
2. Используйте отладку: Вставьте print-выражения в свой код, чтобы отслеживать значения переменных и шаги выполнения программы. Проверьте, что переменные содержат ожидаемые значения, и что ваши условия и циклы выполняются правильно.
3. Ручное тестирование: Попробуйте привести различные наборы входных данных и проверьте, как ваш код обрабатывает эти случаи. Проверьте, что ваш алгоритм работает верно для всех возможных крайних случаев.
Если после этого вы все еще не можете найти ошибку, попробуйте обратиться за помощью на форуме или там, где вы нашли эту задачу, чтобы другие программисты могли помочь вам найти проблему в вашем коде.
1. Проверьте входные данные: Убедитесь, что вы правильно интерпретируете исходное условие и правильно обрабатываете входные данные. Проверьте, что вы верно читаете и обрабатываете входные значения с клавиатуры или файла.
2. Используйте отладку: Вставьте print-выражения в свой код, чтобы отслеживать значения переменных и шаги выполнения программы. Проверьте, что переменные содержат ожидаемые значения, и что ваши условия и циклы выполняются правильно.
3. Ручное тестирование: Попробуйте привести различные наборы входных данных и проверьте, как ваш код обрабатывает эти случаи. Проверьте, что ваш алгоритм работает верно для всех возможных крайних случаев.
Если после этого вы все еще не можете найти ошибку, попробуйте обратиться за помощью на форуме или там, где вы нашли эту задачу, чтобы другие программисты могли помочь вам найти проблему в вашем коде.
Похожие вопросы
- Где ошибка в коде? (Python)
- Ошибка в коде стандарт PEP8 Python
- Ошибка в коде python discord.py
- ПОМОГИТЕ НАЙТИ ОШИБКУ В КОДЕ (выводит наибольшее и наименьшее а среднее нет)
- Discord.py ошибка в коде
- Ошибка в коде на Python
- Ошибка в коде
- Помогите исправить ошибку в коде. Python
- Помогите пожалуйста найти ошибку в коде, третий день голову ломаю
- 25 задание ЕГЭ информатика. Всех четырёх часов не хватит, чтобы дождаться ответа на задачу. Подаю сигнал бедствия!