БлогNot. Задача о периоде цепочки чисел

Задача о периоде цепочки чисел

Такого рода задач можно придумать сколько угодно. Представим, например, что у нас есть целое число n = 10 * a + b, то есть a - это результат целочисленного деления n на 10, а b - остаток от деления на 10. Следующее число цепочки образуется по некоторому правилу, например, n = 2 * a + 3 * b, после чего для него так же вычисляются новые значения a и b.

Для любого числа получаются цепочки значений, которые рано или поздно становятся периодическими, например, для чисел 14 и 28 длина периода равна всего единице, так как 2*1+3*4=14 и 2*2+3*8=28, а для других чисел, например, 1357, имеем период, равный шести: 1357 - 291 - 61 - 15 - 17 - 23 - 13 - 11 - 5 - 15 - ...

Задача состоит в том, чтобы выяснить, какова максимально возможная длина периода.

Можно написать скрипт, который просто выполняет перебор:

<?php
 function periodic ($arr) {
  $len = count($arr);
  if ($len < 2) return 0;
  for ($i = 0; $i < $len - 1; $i++) {
   for ($j = $i + 1; $j < $len; $j++) {
    if ($arr[$i] == $arr[$j]) return $j - $i;
   }
  }
  return 0;
 }

 set_time_limit (0);
 $limit = 1000; //верхняя граница поиска
 ob_implicit_flush();
 for ($num = 0; $num <= $limit; $num++) {
  $c = array ();
  $c[] = $num; echo '<b>'. $num.'</b>: ';
  $n = $num;
  while (($p = periodic($c)) == 0) {
   $a = floor($n/10);
   $b = $n % 10;
   $n = 2 * $a + 3 * $b;
   $c[] = $n; echo $n.' ';
  }
  echo '... period = '.$p.'<br>';
  unset ($c);
  ob_flush(); flush();
  usleep (100000); //пауза 100ms
 }
?>

Но можно поискать и аналитические решения. Например, при 2a+3b > 10a+b или b > 4a и при условиях, что b - натуральное число от 0 до 9, а количество цифр в a может только уменьшаться, имеем при a = b = 9, что предельная длина цепочки равна 4*9+9=45. Перебор чисел от 0 до 1000, выполненный скриптом, вполне эту гипотезу подтверждает, правда, периода повторения больше 6 (и вообще отлтчного от 1, 2 или 6) и не найдено :)


теги: учебное php числа математика

22.01.2019, 11:42; рейтинг: 493