Dzięki
piotrekkr, byłem na matematyka.org i nie do końca znalazłem jak to ugryźć.
.
Dla
jarrod extra wieeeeelkie DANKE !
Przetestowałem skrypt i to jest exactly to o czym talking about

Masz u mnie flaszkę ..

Coś tylko jest w obliczeniach chyba jeszcze nie tak, bo wyniki się czasem nie zgadzają.
Wpisz prosze do bazy liczby 1 5 6 7 7 i daj szukanie sumy 21
Własnie mam to w wyniku kodu i wygląda to tak:
Wynik działania programu:
Liczby w zbiorze: 1,5,6,7,7
szukana suma: 21
Sumę minimalnie większą dają liczby:
1+5+6+7+7=26 reszty: -5
5+6+7+7=25 reszty: -4
Sumę minimalnie mniejszą dają liczby:
6+7+7=20 pozostaje: 1
.. czyli gdzieś się program machnął, bo 1+6+7+7 daje 21 bez reszty, a wynik nie podaje tej informacji
Podobnie (może przyczyna jest ta sama i jest to poprostu już konsekwencją owego błędu) podawane propozycje liczb minimalnie większych i mniejszych nie zawsze są zgodne z prawdą
Poza tym przerobiłem Twój kod podając moje konretne przykłady, w których pojawiają się ułamki z dwoma miejscami po przecinku (kropce), jak i podałem własną, faktycznie szukaną sumę. Załączam kod, ponieważ nie wiem czy zmieniając coś w tablicy, nie zmieniłem czegoś, czego nie powinienem.
<?php
function test($suma=null)
{
if(!$suma) $suma = (251.16); // podana suma jest rzeczywistym szykanym wynikiem
if($suma == 0) return 'Zbiór nie zawiera liczb ujemnych. Nie można wykonać działania.';
elseif($suma == 1) return 'Suma == 1 zatem nie można wykonać działań.';
$liczby[0] = (64.77);
$liczby[1] = (52.59);
$liczby[2] = (54.18);
$liczby[3] = (42.55);
$liczby[4] = (50.18);
$liczby[5] = (52.59);
$liczby[6] = (50.35);
$liczby[7] = (51.88);
$liczby[8] = (53.12);
$liczby[9] = (49.15);
$liczby[10] = (47.05);
$liczby[11] = (52.83);
$liczby[12] = (53.55);
$liczby[13] = (52.96);
$liczby[14] = (51.98);
//
// wpisałem własne liczby jako konkretny przykład
//
// dla porządku można je posortować
// sprawdzam czy suma wszystkich liczb jest większa od szukanej sumy
// inaczej szykanie nie mam sensu
{
$breakAll = false; // kontrola wyników
$nSuma = 0; // suma kontrolna
$wynik = array(); // wynik działania funkcji $tmpKeys = array(); // tu przechowuję indexy liczb użytych w działaniu
// wartość końcową dla tablicy i pętli poniżej zmieniłem na <15 ale niestety nie jestem pewien czy to tak ma być
// zaczynamy iterowanie po tablicy
for($i=0; $i<15;$i++)
{
for($e=$i;$e<15;$e++)
{
$tmpKeys[] = $e;
$nSuma += $liczby[$e];
if($nSuma == $suma) // znaleziono pasujący wynik
{
$wyn = '';
foreach($tmpKeys as $key)
{
$wyn .= $liczby[$key].'+';
}
$wyn .= '='.$nSuma;
$wynik['dokladnie'][] = $wyn;
$nSuma = 0;
break;
}
elseif($nSuma > $suma) // znaleziono pierwszy wyższy wynik
{
$wyn = '';
foreach($tmpKeys as $key)
{
$wyn .= $liczby[$key].'+';
}
$wyn .= '='.$nSuma;
$resta = $suma-$nSuma;
$wynik['wieksze'][] = array($wyn,$resta);
$nSuma = 0;
break;
}
// Poniżej zmieniłem 4 na 14, bo taki nr ma teraz ostatnia liczba, ale bardziej na
intuicję niż wiedzę
elseif($e == 14) // ostatni element -> suma wszystkich pozostałych jest mniejsza od szukanej sumy
{
$breakAll = true;
$wyn = '';
foreach($tmpKeys as $key)
{
$wyn .= $liczby[$key].'+';
}
$wyn .= '='.$nSuma;
$resta = $suma-$nSuma;
$wynik['mniejsze'][] = array($wyn,$resta);
$nSuma = 0;
break;
}
}
if($breakAll) break;
}
}
else
{
}
$wynik['liczby'] = $liczby;
$wynik['suma'] = $suma;
return $wynik;
}
$wyniki = test();
$ret = 'Wynik działania programu:<br/>';
{
$ret .= '<br/>Liczby w zbiorze: '.implode(',',$wyniki['liczby']); $ret .= '<br/>szukana suma: '.$wyniki['suma'].'<br/>';
if(isset($wyniki['dokladnie'])) {
$ret .= '<br/>Dokładny wynik daje suma liczb:<br/>';
foreach($wyniki['dokladnie'] as $wyn)
$ret .= $wyn.'<br/>';
}
if(isset($wyniki['wieksze'])) {
$ret .= '<br/>Sumę minimalnie większą dają liczby:<br/>';
foreach($wyniki['wieksze'] as $wyn)
$ret .= $wyn[0].' reszty: '.$wyn[1].'<br/>';
}
if(isset($wyniki['mniejsze'])) {
$ret .= '<br/>Sumę minimalnie mniejszą dają liczby:<br/>';
foreach($wyniki['mniejsze'] as $wyn)
$ret .= $wyn[0].' pozostaje: '.$wyn[1].'<br/>';
}
if(isset($wyniki['max'])) {
$ret .= 'Suma wszyskich liczb zbioru ('.$wyniki['max'].') jest mniejsza od podanej sumy.';
}
}
else
{
$ret .= $wyniki;
}
?>
Jeszcze raz bardzo dziękuję za pomoc.
Jeżeli temat błędu w kodzie nie jest zawiły do poprawki i nie zniechęciłem Cię jeszcze, byłbym bardzo wdzięczny za korektę. Z importem albo ręcznym zaktualizowaniem danych w kodzie będę sobie już potem jakoś za każdym razem radził.
Pozdrawiam serdecznie
pwsmile :roll2: