download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Помощ за функция за намиране на множители

Автор
Съобщение
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

Нещо не мога да го измисля. Тръгвам с вложени цикли, но ми зацикля мозъка . Струва ми се, че може и рекурсивно да се направи, но там пък хептен оплитам конците.

редактиран от insecteater на 08.08.13 15:44
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), но мога да я сложа тук, чак като се върна от морето.

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.