Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Rozbudowane dzielenie
Forum PHP.pl > Forum > Przedszkole
mlody69
Witam,
chcę napisać skrypt, który dzieli jedną liczbę na wiele. Najlepiej pokażę to na przykładzie bo opisać tego nie potrafię.
A więc
Mam przykładowo liczbę
26 i chcę ją podzielić aby wyszły trzy liczby, które po przemnożeniu przez dane wartości wyniesie 26.

jedna liczba=3
druga=1
trzecia=0

I pierwszą mnożę przez 6 , drugą przez 8 a trzecią 10
Wychodzi: 3*6+1*8+0*10=26.

Myślę, że jasno to przedstawiłem smile.gif
mmica
Hey ;]

Właśnie napisałem Ci coś takiego, ale na chwilę obecną musisz obyć się bez komentarza (i komentarzy ;]), bo muszę właśnie wychodzić - dodałem komentarze do kodu. Wydaje mi się, że kod powinien być w miarę jasny, a oto on:
  1. <?php
  2. $liczba = 26; // liczba do podzielenia
  3. $faktory = $liczba/3; // 3 - ilosc skladnikow wyniku
  4. $dzielniki = array(); // nasze przyszle iloczyny...
  5. $wyniki_czesciowe = array(); // podzielone przez dzielniki faktory
  6.  
  7. for($i=0; $i<3;)
  8. {
  9. $wylosowana=rand(1,10); // losuje liczbe z zakresu 1-10
  10.  
  11. // jezeli wylosowana liczba nie zostala jeszcze wylosowana
  12. // dodaj ja do dzielnikow i inkrementuj $i
  13. // w przeciwnym wypadku wykonaj przebieg petli jeszcze raz
  14. if(!in_array($wylosowana, $dzielniki))
  15. {
  16. $dzielniki[$i] = $wylosowana;
  17. ++$i;
  18. }
  19. }
  20.  
  21. for($i=0; $i<3; $i++)
  22. {
  23. $wyniki_czesciowe[$i]=$faktory/$dzielniki[$i];
  24. }
  25.  
  26. // Wyswietlanie rownania
  27. for($i=0; $i<3; $i++)
  28. {
  29. echo '('.$wyniki_czesciowe[$i].'*'.$dzielniki[$i].')';
  30. if($i==2)
  31. {
  32. echo '='.$liczba;
  33. } else
  34. {
  35. echo '+';
  36. }
  37. }
  38. ?>


Pozdrawiam,
mmica
mlody69
Bardzo dziękuję, troche mi to rozjaśniło jednak ja potrzebuję tylko liczb całkowitych, bez liczb po przecinku i nie bardzo wiem jak to zmienić
mmica
To akurat nie jest problemem winksmiley.jpg, ale musisz pamiętać, że tracisz wtedy na dokładności. Rozwiązanie:
w linii 29. masz:
  1. echo '('.$wyniki_czesciowe[$i].'*'.$dzielniki[$i].')';

zamień na:
  1. echo '('.(int)$wyniki_czesciowe[$i].'*'.(int)$dzielniki[$i].')';

Zostało tu wykorzystane rzutowanie na liczbę całkowitą (int), przez co przy okazji została odrzucona część ułamkowa.

//edit: doszedłem do wniosku, że lepiej będzie jak użyjesz funkcji round(). Zaokrągli ona wyniki i utnie ułamki, a więc w linii 29.:
  1. echo '('.round($wyniki_czesciowe[$i]).'*'.round($dzielniki[$i]).')';


Pozdrawiam,
mmica
mlody69
No tak, w sumie to było proste. Jednak dalej mój skrypt wymaga, że liczby przez które są mnożone losowe liczby musza być stałe, tak jak napisałem:6,8,10 i ósemka nie może być mnożona więcej niż 12 razy a dziesiątka więcej niż 4. PRzepraszam, że wcześniej tego nie napisałem ale tak wyszło w trakcie.
mmica
Czyli inaczej mówiąc, skrypt musi znaleźć odpowiednie czynniki do czynników 6, 8, 10, tak, aby suma tych trzech składników będących iloczynami tychże czynników była równa 26? Pomieszałem chyba trochę, ale tak to zrozumiałem winksmiley.jpg

Pozdrawiam,
mmica
mlody69
Tak, oczywiście nie bedzie to ciągle używana liczba 26 tylko jakaś zmienna. Ale o to chodzi.
mmica
Taka modyfikacja kodu i mamy to co chcemy:
  1. <?php
  2. $liczba =123; // liczba do podzielenia
  3. $faktory = $liczba/3; // 3 - ilosc skladnikow wyniku
  4. $dzielniki = array(6, 8, 10); // stale czynniki
  5. $wyniki_czesciowe = array(); // podzielone przez dzielniki faktory
  6.  
  7. for($i=0; $i<3; $i++)
  8. {
  9. $wyniki_czesciowe[$i]=$faktory/$dzielniki[$i];
  10. }
  11.  
  12. // Wyswietlanie rownania
  13. for($i=0; $i<3; $i++)
  14. {
  15. echo '('.round($wyniki_czesciowe[$i]).'*'.round($dzielniki[$i]).')';
  16. if($i==2)
  17. {
  18. echo '='.$liczba;
  19. } else
  20. {
  21. echo '+';
  22. }
  23. }
  24. ?>


Pozdrawiam,
mmica
mlody69
A możliwe jest zrobienie takiego czegoś,że czynniki 8 i 10 nie mogą być mnożone przez liczbę większą przez 12 i 10?
mmica
Hey ;]

Coś Ci zdanie nie wyszło. Rozumiem, że chcesz uniemożliwić mnożenie czynników 8 i 10 przez, odpowiednio, 12 i 10. Jeżeli tak, to skrypt wygląda następująco (zwróć uwagę na linie 13. - 19.):
  1. <?php
  2. $liczba = 1231276;
  3. $faktory = $liczba/3;
  4. $dzielniki = array(6, 8, 10);
  5. $wyniki_czesciowe = array();
  6.  
  7. for($i=0; $i<3; $i++)
  8. {
  9. $wyniki_czesciowe[$i]=$faktory/$dzielniki[$i];
  10. }
  11.  
  12. /* ----------------------------------------------------- */
  13. if($wyniki_czesciowe[2] > 12) // czynnik oddzialujacy na dzielnik 2 (8)
  14. {
  15. die('Czynnik 8 chce byc pomnozony przez liczbe wieksza niz 12! Operacja przerwana.');
  16. } elseif($wyniki_czesciowe[3] > 10) // czynnik oddzialujacy na dzielnik 3 (10)
  17. {
  18. die('Czynnik 10 chce byc pomnozony przez liczbe wieksza niz 10! Operacja przerwana.');
  19. }
  20. /* ----------------------------------------------------- */
  21.  
  22. // Wyswietlanie rownania
  23. for($i=0; $i<3; $i++)
  24. {
  25. echo '('.round($wyniki_czesciowe[$i]).'*'.round($dzielniki[$i]).')';
  26. if($i==2)
  27. {
  28. echo '='.$liczba;
  29. } else
  30. {
  31. echo '+';
  32. }
  33. }
  34. ?>


Cytat
A możliwe jest [..]

Możliwe jest wszystko winksmiley.jpg. Wystarczy tylko ruszyć głową i użyć wyobraźni, bo po coś ją mamy (spójrz na moją sygnaturę [cytat Einstein'a]).

Pozdrawiam,
mmica
mlody69
No tak, nie wyszło. Chodziło mi o to aby czynniki 8 i 10 nie były mnożone przez liczbę większą niż 12 i 10.
Czyli może to wyglądać tak
6*14
8*12
10*10

a nie:
6*14
8*26
10*17
mmica
Czyli nie mają być mnożone, ale równie ma zostać wykonane tak, aby zrzucić ciężar na czynnik '6' (zdjąć nadmiar z pozostałych czynników)? Pytam bo nie chcę pisać kolejnych linii kodu, który i tak się nie przyda tongue.gif.

Pozdrawiam,
mmica
mlody69
Dokładnie.

P.S Bardzo Ci dziękuję za pomoc i zainteresowanie winksmiley.jpg
mmica
Hey ;]

Ze zmarzniętymi paluchami ciężko nawet echo() napisać, ale po bardziej krótkich niż długich zmaganiach (przedłużyły się, bo głupi zacząłem liczyć indeksy tablicy od 1..) wymyśliłem coś takiego (interesują Cię linie 13. - 25.):
  1. <?php
  2. $liczba = 1000;
  3. $faktory = $liczba/3;
  4. $dzielniki = array(6, 8, 10);
  5. $wyniki_czesciowe = array();
  6.  
  7. for($i=0; $i<3; $i++)
  8. {
  9. $wyniki_czesciowe[$i]=$faktory/$dzielniki[$i];
  10. }
  11.  
  12. // --------------------------------------------------
  13. if($wyniki_czesciowe[2] > 10)
  14. {
  15. $do_dodania = ($wyniki_czesciowe[2]*10)-(10*10);
  16. $wyniki_czesciowe[2] = 10;
  17. $wyniki_czesciowe[0] += $do_dodania/6;
  18. }
  19.  
  20. if($wyniki_czesciowe[1] > 12)
  21. {
  22. $do_dodania = ($wyniki_czesciowe[1]*8)-(8*12);
  23. $wyniki_czesciowe[1] = 12;
  24. $wyniki_czesciowe[0] += $do_dodania/6;
  25. }
  26. // --------------------------------------------------
  27.  
  28.  
  29. // Wyswietlanie rownania
  30. for($i=0; $i<3; $i++)
  31. {
  32. echo '('.round($wyniki_czesciowe[$i]).'*'.round($dzielniki[$i]).')';
  33. if($i==2)
  34. {
  35. echo '='.$liczba;
  36. } else
  37. {
  38. echo '+';
  39. }
  40. }
  41. ?>


Nie ma za co dziękować, ja chcę więcej takich tongue.gif. Przynajmniej ciekawsze niż klepanie kolejnego skryptu komentarzy..

Pozdrawiam,
mmica
mlody69
Czyli teraz jak dzielniki 6,8,10 będę chciał zamienić na inne to zmienam zmienną dzielniki oraz
  1. $do_dodania = ($wyniki_czesciowe[2]*14)-(10*14);
  2. $do_dodania = ($wyniki_czesciowe[1]*9)-(9*12);
mmica
Tak. Możesz się jeszcze pobawić z define() i niektóre rzeczy pozamieniać na zmienne etc., aby kod był bardziej elastyczny i zrozumiały, bo ja sobie tu użyłem skrótu myślowego i nie wiem czy ktokolwiek od razu zajarzyłby o co chodzi w np. tej linijce:
  1. $do_dodania = ($wyniki_czesciowe[2]*14)-(10*14);

Skrypt można nazwać względnie pożytecznym przykładem matematyki praktycznej happy.gif

Pozdrawiam,
mmica
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.