@kirillleogky

Решение 1/n- Cycle?

Есть ката - https://www.codewars.com/kata/5a057ec846d843c81a00...
Решение:

function cycle(n) {
  if (n % 2 == 0 || n % 5 == 0) return -1;
  let i = 0, val = 1;
  while (++i) {
    val = val * 10 % n;
    if (val == 1) return i;
  }
}



Подскажите не могу понять
Что именно делает этот кусок кода?:
val = val * 10 % n;
  • Вопрос задан
  • 66 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Элегантное решение всё основано на этой строке.
Поскольку интересует дробь 1 / n, сначала переменная val равна 1.
Вспомните деление в столбик, десятичную запись числа.
Первая цифра, поскольку n>1, всегда 0 целых. И далее идут дробные.
Чтобы получить первую цифру после запятой, имеющийся остаток с предыдущего шага (1) умножаем на 10 и делим на n.

Например, 1/7. Записываем
0.
остаток 1

1 * 10 = 10, делим 10 / 7, получается 1 целая и 3/7
Цифра 1 – первая после запятой (но она сама по себе в этой задаче никак не нужна), и остаток 3:
0.1
остаток 3

Этот остаток далее опять умножим на 10 * 3 = 30 и опять поделим на 7, чтобы получить следующую цифру (4).
И так далее.

До тех пор, пока снова не появится единица – с неё мы начинали, значит, второе её появление уже новый виток цикла цифр.

Для истории приведу
текст задания на англ.
Let be n an integer prime with 10 e.g. 7.
1/7 = 0.142857 142857 142857 ....

We see that the decimal part has a cycle: 142857. The length of this cycle is 6. In the same way:
1/11 = 0.09 09 09 .... Cycle length is 2.

Task
Given an integer n (n > 1), the function cycle(n) returns the length of the cycle if n and 10 are coprimes, otherwise returns -1.

Examples:
cycle(5) = -1
cycle(13) = 6 -> 0.076923 076923 0769
cycle(21) = 6 -> 0.047619 047619 0476
cycle(27) = 3 -> 0.037 037 037 037 0370
cycle(33) = 2 -> 0.03 03 03 03 03 03 03 03
cycle(37) = 3 -> 0.027 027 027 027 027 0
cycle(94) = -1 

cycle(22) = -1 since 1/22 ~ 0.0 45 45 45 45 ...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
l3ftoverz
@l3ftoverz Куратор тега JavaScript
Люблю Финский металкор
Умножить val на 10, взять остаток от деления на n.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Stream Labs Москва
До 150 000 ₽
Mentalstack Санкт-Петербург
от 100 000 до 150 000 ₽
Salesbeat Москва
от 150 000 до 250 000 ₽