Помощ за функция за намиране на множители
Автор |
|
insecteaterЧет, 08.08.13, 15:16 |
Блъскам се над следното нещо: function multipliers($number, $count) () |
$number и $count са целочислени. Целта е да се намерят всички множители, които са $count на брой и като се умножат да дават $number Например multipliers(6, 3) трябва да върне в масив следните комбинации: 1 2 3 2 1 3 2 3 1 1 3 2 3 2 1 3 1 2 1 1 6 1 6 1 6 1 1 ... така де, схванахте идеята - като се умножат, дават първия параметър а пък multipliers(6, 2) да върне 2 3 3 2 1 6 6 1 Нещо не мога да го измисля. Тръгвам с вложени цикли, но ми зацикля мозъка . Струва ми се, че може и рекурсивно да се направи, но там пък хептен оплитам конците. | | phrozencrewЧет, 08.08.13, 15:55 |
На прима виста ми хрумва една идея - да се проверява чрез деление на всички числа, по-малки от резултата, като се събират в масив за допълнителна обработка само тези, които при делението нямат остатък. В уравнението винаги може да участва 1-ца. В случая с 6 ще трябва да го обработим с (6-0, 6-1, 6-2,..., 6-5) пъти. if(6%x == 0){ x се вкарва в масива } Нещо от сорта. | | insecteaterЧет, 08.08.13, 16:06 | RE: Помощ за функция за намиране на множители
” На прима виста ми хрумва една идея - да се проверява чрез деление на всички числа, по-малки от резултата, като се събират в масив за допълнителна обработка само тези, които при делението нямат остатък. В уравнението винаги може да участва 1-ца. В случая с 6 ще трябва да го обработим с (6-0, 6-1, 6-2,..., 6-5) пъти. if(6%x == 0){ x се вкарва в масива } Нещо от сорта. „ Това, да, и аз тка тръгнах да го правя, само че втория параметър вкарва дълбочина на вложените цикли ... :( Ако е само два множителя, е елементарно. Целта е обаче произволно зададен брой множители :( | | insecteaterЧет, 08.08.13, 16:10 |
То винаги може да се направи и "bruteforce" вариант, но при по-голям втори параметър, ще има да чааааакам .... | | insecteaterПет, 09.08.13, 09:40 |
function multipliers($number , $count) {
if($count == 1)
return array(array($number));
$result = array();
for($i = 1 ; $i <= $number; $i++) {
if($number%$i === 0) {
$subs = multipliers($number/$i , $count-1);
foreach($subs as $sub) {
$result[] = array_merge(array($i) , $sub);
}
}
}
return $result;
} |
Някакъв много симпатичен младеж на име Guillaume Leclerc, завършил 2012-та в Lycée Notre- Dame de la Providence ми я сътвори за нула време, докато съм спал (постнах и в групата PHP във facebook) От една страна се радвам, че няма да се занимавам с нея, от друга страна ми е малко мъчно, че вече съм стар и не мога да се сещам толкова бързо за тия работи. | | programingsСъб, 24.08.13, 17:21 |
Добре, много интересно. Експериментирам с функцията от вчера. Защо ако се подаде 37 за $number и 9 за $count, резултата е следния: Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 37 )
Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 37 [8] => 1 )
Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 [4] => 1 [5] => 1 [6] => 37 [7] => 1 [8] => 1 )
Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 [4] => 1 [5] => 37 [6] => 1 [7] => 1 [8] => 1 )
Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 [4] => 37 [5] => 1 [6] => 1 [7] => 1 [8] => 1 )
Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 37 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 1 )
Array ( [0] => 1 [1] => 1 [2] => 37 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 1 )
Array ( [0] => 1 [1] => 37 [2] => 1 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 1 )
Array ( [0] => 37 [1] => 1 [2] => 1 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 1 ) |
| | insecteaterНед, 25.08.13, 12:48 |
Накратко: 1 х 37 и 37 х 1 са различни. Надълго: Функцията връща всички намерени множители, като прави разлика в позициите им. На мен например ми трябваше такава функция, за да направя скрипт, който да показва различните начини за пакетиране и да избира най-оптималния. Има разлика дали кашона ще е 50 сантиметра дълъг и метър висок или ще е 50 сантиметра висок и метър дълъг. Първият вариант е доста по-неудобен за употреба. Както и дали в 1 кашон ще събереш 37 артикула или 37 артикула ще разположиш всеки в самостоятелно кашонче Има и вариант на функцията, който връща множителите уникално (твоят пример ще върне само един вариант, а не 9), но мога да я сложа тук, чак като се върна от морето. | | Коментар |