Во-первых.,,не используйте строки, не используйте parseInt
, не держите всю последовательность сразу.Вам нужны только цифры, и вам нужны только две последние цифры.Для числа x
от 10 до 18 (которое является максимально возможной суммой из двух цифр) его место в десятках составляет 1
, а в его местах - x - 10
.Одно это будет значительным улучшением.
Во-вторых.,,поскольку вся последовательность после заданной точки определяется первыми двумя цифрами в этой точке, 1 и имеется только 100 возможных последовательностей из двух цифр, каждая последовательность должна повторяться в пределах 200 цифр;то есть, в пределах не более 200 цифр, он обязательно войдет в цикл повторяющихся цифр, из которого он никогда не выйдет, где длина этого цикла меньше 200 цифр. 2 Так что если n
больше чемнесколько сотен можно существенно оптимизировать, найдя длину этого цикла и "пропустив" большое кратное этой длины.
1.На самом деле, это не совсем так, как написано.Например, последовательности 69156… и 79167… bot содержат 91, но за ними следуют разные вещи.Это связано с тем, что «1» относится к двузначному числу, оба , чьи цифры определяются двумя предыдущими цифрами.Я не уверен, как это выразить лучше, но, надеюсь, вы понимаете, о чем я.Это не влияет на общий аргумент, но вы должны быть осторожны при применении идеи.
2.На самом деле гораздо меньше;проверяя все возможные значения a и b , я обнаружил, что последовательность всегда входит в цикл и завершает свою первую итерацию всего за 25 цифр!Но я не уверен, как строго обосновать эту гораздо меньшую цифру, кроме исчерпывающего тестирования;так что, вероятно, было бы обманом писать код так, чтобы он опирался на него.