БлогNot. PHP: ищем представление Цекендорфа для чисел

PHP: ищем представление Цекендорфа для чисел

Красивое утверждение, называемое теоремой Цекендорфа, гласит, что любое натуральное число может быть представлено в виде суммы не идущих подряд чисел Фибоначчи и это представление единственно.

Ниже показан небольшой код на PHP, который выводит представления Цекендорфа для чисел $m, $m-1, ..., 1, значение $m задано в первой строке скрипта.

Вывод скрипта вот такой (показан верхний фрагмент экрана):

вывод скрипта представлений Цекендорфа
вывод скрипта представлений Цекендорфа

После отладочной печати массива из самих чисел Фибоначчи, в очередной строке печатается десятичное число, затем его представление в Фибоначчиевой системе счисления и в виде десятичной суммы Цекендорфа, при этом умножаемые на единицу, а не на ноль числа Фибоначчи выделены красным цветом.

В конце строк в скобках выводятся результаты проверки сгенерированной формулы функцией eval, обратите внимание на оператор eval("return $formula;"), если в $formula записано что-то вроде 0*1+0*2+1*3+0*5+1*8, это нужно делать именно так. Выполнить скрипт, как и любой другой код на PHP, можно на локальном хосте, если его установить и настроить.

Ниже приведён полный исходник скрипта на PHP.

<?php
$m = 100; //Верхняя граница обработки

//Делаем ряд Фибоначчи из чисел до $m 
$F = array(1,1);
while ($F[count($F)-1] <= $m) $F[] = $F[count($F)-1] + $F[count($F)-2];

print_r ($F); echo '<br>'; //Печатаем ряд Фибоначчи (для отладки)
 
while ($n = $m--) { //Обрабатываем числа от $m до 1
 while ($F[count($F)-1] > $n) array_pop($F);
 $l = count($F)-1;
 echo "$n = "; //Исходное число
 //В Фибоначчиевой системе счисления:
 $number = '';
 while ($n) { 
  if ($n >= $F[$l]) {
   $n = $n - $F[$l];
   $number .= '1';
  } 
  else $number .= '0';
  --$l;
 }
 $number .= str_repeat('0',$l);
 echo $number.' = ';
 //В десятичном представлении:
 $formula = $text = ''; //Формула для проверки и текст с выделением цветом
 $k = 1;
 for ($i=strlen($number)-1; $i>-1; $i--) {
  $formula .= $number[$i]. '*'. $F[$k];
  $text .= $number[$i]. '*'. ($number[$i]=='1'?'<font color="red">':'').
   $F[$k++]. ($number[$i]=='1'?'</font>':'');
  if ($i>0) { $formula .= '+'; $text .= '+'; }
 }
 echo $text.' ('.eval("return $formula;").")<br>\n";
}
?>

27.10.2017, 14:06 [2150 просмотров]


теги: числа php математика

К этой статье пока нет комментариев, Ваш будет первым