Основная проблема заключается в том, что код не останавливается, когда он фактически находит размер цикла;внутренний цикл for
продолжает выполняться.
Я бы настоятельно рекомендовал бы использовать значимые имена переменных, поскольку это делает его более понятным, что на самом деле делает код!Кроме того, переместите неочевидный код (((10 ** j) % i) == 1
) в метод, чтобы предотвратить загрязнение «основного» кода сложными деталями реализации.
(На самом деле этот метод не всегда работает должным образом, например,i = 6
, но это пока не главный блокатор ...)
Давайте рассмотрим случай, когда вы ищите размер цикла 1/9
:
def is_cycle_size?(denominator, cycle_size)
(10 ** cycle_size) % denominator) == 1
end
denominator = 9
for cycle_size in 1..denominator
if is_cycle_size?(cycle_size, denominator)
puts "cycle_size is #{cycle_size}"
end
end
# Output:
cycle_size is 1
cycle_size is 2
cycle_size is 3
cycle_size is 4
cycle_size is 5
cycle_size is 6
cycle_size is 7
cycle_size is 8
cycle_size is 9
Сейчаспроблема стала более очевидной.Вы на самом деле не хотите перебирать все возможные размеры цикла;вы действительно просто хотите получить размер цикла!
Другими словами, ваша базовая структура кода должна выглядеть следующим образом:
denominator_with_largest_cycle_size = 0
largest_cycle_size = 0
def find_cycle_size(denominator)
# Define me!!
end
for denominator in 1..1000
cycle_size = find_cycle_size(denominator)
puts "denominator is #{denominator}, cycle size is #{cycle_size}"
if largest_cycle_size < cycle_size
denominator_with_largest_cycle_size = denominator
largest_cycle_size = cycle_size
end
end
(Есть и другие улучшенияэто тоже можно сделать; это только «минимальное» изменение вашей попытки.)
Обратите внимание, что, выполнив это, вы также можете протестировать find_cycle_size
в изоляции, например, вы должны иметь возможность запустить find_cycle_size(238487)
.
Бонус: После того, как вы выяснили, как определить вышеописанный метод, этот код рубина можно упростить до:
denominator_with_largest_cycle_size = (1..1000).max_by do |denominator|
find_cycle_size(denominator)
end