Skocz do zawartości

Mały problem matematyczny ;)


Saint

Rekomendowane odpowiedzi

Nigdy nie miałem głowy do przedmiotów ścisłych dlatego szukam jakiegoś małego skryptu, który wygenerował by mi wszystkie możliwości takiego działania:

x * y * z * q = abc (abc jest znane)

np. gdy wynik jest 40 to mamy 2 * 4 * 1 * 5 = 40

Ogólnie mówiąc potrzebne mi cyfry, które przemnożone przez siebie dadzą mi wynik, który znam.

Z góry dziękuję.

Giełda Domen Internetowych - najlepsze domeny w sieci
Odnośnik do komentarza
Udostępnij na innych stronach

Maximus Marius, można też do tego podejść od strony 4 pętel po 9 iteracji, da to maksymalnie 6561 iteracji więc nic wielkiego.

$wynik = 40;
for( $x = 1; $x < 10; $x++ )
{
for( $y = 1; $y < 10; $y++ )
{
	for( $z = 1; $z < 10; $z++ )
	{
		for( $q = 1; $q < 10; $q++ )
		{
			$r = $x * $y * $z * $q;
			if( $r === $wynik )
			{
				echo $x .'*'. $y .'*'. $z .'*'. $q . "\n";
			}
		}
	}
}
}

Do tego można dodać sortowanie, sprawdzanie unikalnych kombinacji. Zakres działań nie jest zbyt duży by była idea optymalizowania tego...

stopka usunieta z wpoodu wirusa na stronie docelowej

Odnośnik do komentarza
Udostępnij na innych stronach

MMP: zapomniałeś o print ;)?

$abc = 216;

for ($x = 1; $x <= $abc; $x++) {
 for ($y = 1; $y <= $abc; $y++) {
 for ($z = 1; $z <= $abc; $z++) {
	for ($q = 1; $q <= $abc; $q++) {
	   if ($x*$y*$z*$q == $abc) {
		  printf("%d * %d * %d * %d = %d<br />" . PHP_EOL, $x, $y, $z, $q, $abc);
	   }
	}
 }
 }
}

Mam coś takiego, ale chyba coś zwaliłem przy printif i nie wiem co.

Giełda Domen Internetowych - najlepsze domeny w sieci
Odnośnik do komentarza
Udostępnij na innych stronach

MMP po Tobie nie spodziewałem się herezji ;)

Saint tu do niczego nie jest potrzebna print ;)

Poniżej poprawiona wersja twojego skryptu, ale z wydajnością ona nie ma nic wspólnego ;>

<?
$abc = 216;

for ($x = 1; $x <= $abc; $x++) {
 for ($y = 1; $y <= $abc; $y++) {
 for ($z = 1; $z <= $abc; $z++) {
	for ($q = 1; $q <= $abc; $q++) {
	   if ($x*$y*$z*$q == $abc) {
		  echo 'x = '.$x; 
		  echo '; y = '.$y; 
		  echo '; z = '.$z; 
		  echo '; q = '.$q;
		  echo "\n"; 
	   }
	}
 }
 }
}
?>

"bytka abo ne bytka to je zapytka" - W. Shakespeare ;)

Niekończąca się impreza ;) ... wątroba zaleczona :D

Odnośnik do komentarza
Udostępnij na innych stronach

Napisałem uniwersalną wersję z rekurencją:

function dzielniki($x, $arr=array(), $znalezione=array())
{  if (!$arr)
 { $znalezione = array();
if (!$x) return;
if ($x == 1) $znalezione[] = array(1);
 }
 $ile = 0;
 for($r = $x; $r >= 2; $r--)
 { if (intval($x/$r) === $x/$r)
{ $znalezione = dzielniki($x/$r, array_merge($arr, array($r)), $znalezione);
  $ile++;
 }
 }
 if (!$ile)
 { // $arr[] = $x; // jedynki
rsort($arr, SORT_NUMERIC);
foreach($znalezione as $f)
  if ($f === $arr)
	return $znalezione;
$znalezione[] = $arr;
 }
 return $znalezione;
}

// przyklad:
$znalezione = dzielniki(216);

foreach($znalezione as $zestaw)
{ // if(count($zestaw) == 4) // tylko wyniki składające sę z 4 liczb
 {  foreach($zestaw as $liczba)
  echo "$liczba, ";
echo "<br>\r\n";
 }
}

Jeśli chcesz mieć jedynki uwzględnione w wynikach, to usuń znak komentarza z linii 15, a jeśli interesują Cię tylko wyniki złożone z 4 liczb, to usuń komentarz z linii 29.

and

Odnośnik do komentarza
Udostępnij na innych stronach

noone, ale dlaczego znowu herezji. cyfr w matematyce jest dziesięć: 0,1,2,3,4,5,6,7,8,9. Zero nam odpada, więc pozostaje 9 cyfr, więc w sumie mamy ograniczoną liczbę pełnych pętli.

Z tego co widzę do saint miał na myśli liczby, więc tematu w praktyce nie ma. Wynikiem zawsze będzie nieskończoność.

stopka usunieta z wpoodu wirusa na stronie docelowej

Odnośnik do komentarza
Udostępnij na innych stronach

Z tego co widzę do saint miał na myśli liczby, więc tematu w praktyce nie ma. Wynikiem zawsze będzie nieskończoność.

OK... inaczej, robimy to tak np. abc = 216 i teraz szukam 4 cyfr, które przemnożone przez siebie dadzą wynik 216 do tego aby skrypt uwzględniał też różne ustawienia tych cyfr w działaniu czyli: xyzq, qzxy, zxyq itd. i żeby te wszystkie możliwości po uruchomieniu tego nieszczęsnego skryptu były "printowane".

Dla przykładu dla 2304 mamy tak:

4889

4898

4988

8849

8489

8498

9488

9848

8894

8948

8984

9884

6886

6868

6688

8686

8668

8866

Giełda Domen Internetowych - najlepsze domeny w sieci
Odnośnik do komentarza
Udostępnij na innych stronach

Saint 4 cyfry czy 4 liczby ;) ?

Mówiłem, że nie jestem dobry w te klocki i sie gubie ;), ale napisalem x * y * z * q a nie xxxx * y * z * q :)

Mam coś tagiego teraz:

<?php
echo '<code>';

$abc = 2304;

for ($x = 1; $x <= 9; $x++) {
 for ($y = 1; $y <= 9; $y++) {
 for ($z = 1; $z <= 9; $z++) {
	for ($q = 1; $q <= 9; $q++) {
	   if ($x*$y*$z*$q == $abc) {
		  printf("%d%d%d%d<br />" . PHP_EOL, $x, $y, $z, $q);
	   }
	}
 }
 }
}

echo '</code>';
?>

Giełda Domen Internetowych - najlepsze domeny w sieci
Odnośnik do komentarza
Udostępnij na innych stronach

function dzielniki($x, $arr=array(), $znalezione=array())
{  if (!$arr)
 { $znalezione = array();
if (!$x) return;
if ($x == 1) $znalezione[] = array(1);
 }
 $ile = 0;
 for($r = $x; $r >= 2; $r--)
 { if (intval($x/$r) === $x/$r)
{ $znalezione = dzielniki($x/$r, array_merge($arr, array($r)), $znalezione);
  $ile++;
 }
 }
 if (!$ile) $znalezione[] = $arr;

 return $znalezione;
}

function znajdz_dzielniki($liczba, $ile_liczb_w_wyniku=4)
{ $znalezione = dzielniki($liczba);
 foreach($znalezione as $i => $zestaw)
if (count($zestaw) != $ile_liczb_w_wyniku) // tylko wyniki składające sę z 4 liczb
  unset($znalezione[$i]);
 sort($znalezione);
 return $znalezione;
}

// przykład wykorzystania:

$znalezione = znajdz_dzielniki(216);
foreach($znalezione as $zestaw)
 echo implode($zestaw, ',')."<br>\r\n";

and

Odnośnik do komentarza
Udostępnij na innych stronach

mi wyszło:

116 kombinacji ;)

1389
1398
1469
1496
1649
1666
1694
1839
1893
1938
1946
1964
1983
2269
2296
2349
2366
2394
2439
2493
2629
2636
2663
2692
2926
2934
2943
2962
3189
3198
3249
3266
3294
3338
3346
3364
3383
3429
3436
3463
3492
3626
3634
3643
3662
3819
3833
3891
3918
3924
3942
3981
4169
4196
4239
4293
4329
4336
4363
4392
4619
4633
4691
4916
4923
4932
4961
6149
6166
6194
6229
6236
6263
6292
6326
6334
6343
6362
6419
6433
6491
6616
6623
6632
6661
6914
6922
6941
8139
8193
8319
8333
8391
8913
8931
9138
9146
9164
9183
9226
9234
9243
9262
9318
9324
9342
9381
9416
9423
9432
9461
9614
9622
9641
9813
9831

Giełda Domen Internetowych - najlepsze domeny w sieci
Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności