PHP генерирует математическое уравнение из ответа

Мне нужна функция, написанная на PHP, для генерации простого математического уравнения с использованием ответа. Например:
Входные данные:

6688650

Вывод: (или что-то похожее)

75 * 34 * (1 * (43 * 61))

Входные данные:

249366

Вывод: (или что-то похожее)

(((99 + 87) + 95 * 99) * 26)

Я придумал этот генератор основных факторов, но мне нужен способ превратить факторы в уравнение, подобное (((99 + 87) + 95 * 99) * 26)

function primefactor($num) {
$sqrt = sqrt($num);
for ($i = 2; $i <= $sqrt; $i++) {
if ($num % $i == 0) {
return array_merge(primefactor($num/$i), array($i));
}
}
return array($num);
}

И с генератором чисел:

do {
$num = mt_rand(6542,89523498);

} while (is_prime($num) & count(primefactor($num)) > 5);

Это оставляет меня с чем-то вроде:

Original: 78973465
Array ( [0] => 349 [1] => 271 [2] => 167 [3] => 5 )

0

Решение

  1. Преобразуйте ваше целое число в массив простых факторов.

  2. Вы можете объединить свои основные факторы, однако вы решили создать уравнение. Тем не менее, это не 1:1 функция (если число не простое). Таким образом, вы можете проявить творческий подход к тому, как вы хотите объединить числа вместе.

В этой реализации, Я решил сгенерировать случайное сложение и объединение простых чисел для формирования совместных простых чисел.

Создание эффективного способа первичной факторизации становится немного более сложной задачей. Я написал очень простой здесь, и, скорее всего, он будет соответствовать вашим потребностям. Однако, если вам нужен более быстрый метод (или если вы имеете дело с гораздо большими числами или многими другими числами), вы можете провести некоторое независимое исследование. Я гуглил это и это предложение появился.

<?php

$n = 6688650;

//generates a list of all factors
function primefactor($num) {
$sqrt = sqrt($num);
for ($i = 2; $i <= $sqrt; $i++) {
if ($num % $i == 0) {
return array_merge(primefactor($num/$i), array($i));
}
}
return array($num);
}

//generates multiplication equation
//  Let's scramble those numbers

$factors = primefactor($n);

//let's randomly combine some of our prime factors
for ($i = 0, $len = count($factors); $i < $len; $i++) {
if (mt_rand(0,1)) {
$keys = array_rand($factors,2);
$to = $factors[$keys[0]]*$factors[$keys[1]];
array_push($factors, $to);
unset($factors[$keys[0]]);
unset($factors[$keys[1]]);
}
}

//now, let's insert some random addition
foreach ($factors as $key => $value) {
if (mt_rand(0,1)) {
$delta = mt_rand(1,$factors[$key]-1);
$factors[$key] = '(' . ($value-$delta) . '+' . $delta . ')';
}
}

//output the information
$myValues = array_values($factors);
shuffle($myValues);
echo join('*',$myValues);

?>
5185*(145+1145)
3*(59+27)*(23+62)*(269+36)
1462*(26+35)*5*5*(2+1)
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector