Munten uitrekenen in een bedrag
Voorbeeld:
1.50 = 1 x 100 en 1 x 50
3.65 = 1 x 200 en 1 x 100 en 1 x 50 en 1 x 10 en 1 x 5
4.95 = 2 x 200 en 1 x 50 en 2 x 20 en 1 x 5
De gebruikte munten moeten dan opgeslagen worden in een array?
Er moeten dus weinig mogelijk munten gebruikt worden om het bedrag op 0 te krijgen.
Heeft iemand een idee hoe dit zou moeten?
Initieel is de rest gelijk aan het bedrag.
Herhaal
- Zoek de grootste valuta kleiner dan of gelijk aan de rest.
- Trek deze valuta (of een veelvoud) af van deze rest en onthoud hoeveel dit was.
Zolang de rest groter is dan (ongelijk is aan) 0.
Hierbij kun je ofwel aannemen dat het oorspronkelijke bedrag splitsbaar is of hier op controleren.
Gewijzigd op 13/10/2016 14:37:28 door Thomas van den Heuvel
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$reken_prijs = 480;
$munten_array = array("200", "100", "50", "20", "10", "5");
$teller = 1;
do {
if ($teller > 50) { exit; }
foreach ($munten_array as $munt) {
if ($munt < $reken_prijs) {
$reken_prijs = $reken_prijs - $munt;
$gebruikte_munten = $gebruikte_munten . $munt."-";
}
}
$teller++;
} while ($reken_prijs == 0);
$munten_array = array("200", "100", "50", "20", "10", "5");
$teller = 1;
do {
if ($teller > 50) { exit; }
foreach ($munten_array as $munt) {
if ($munt < $reken_prijs) {
$reken_prijs = $reken_prijs - $munt;
$gebruikte_munten = $gebruikte_munten . $munt."-";
}
}
$teller++;
} while ($reken_prijs == 0);
Dit geeft die dan als uitkomst:
200-100-50-20-10-5-5-
Hoe kan ik zorgen dat die weer begint aan het begin van de array want ga ervan uit dat het daar fout gaat?
Gewijzigd op 13/10/2016 14:43:32 door Sietsko Bos
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$WisselBedrag = 1.95;
$EuroCenten = array(10000,5000,2000,1000,500,200,100,50,20,10,5,2,1);
$MuntenArray = array();
echo $WisselBedrag.'<br/><br/>';
$WisselBedrag *= 100;
foreach($EuroCenten as $key => $value)
{ while($WisselBedrag >= $value)
{ $MuntenArray[$value] += 1;
$WisselBedrag -= $value;
}
}
foreach($MuntenArray as $key => $value)
{ echo $value.' x '.number_format($key/100, 2, ',', '').'<br/>';
}
?>
$WisselBedrag = 1.95;
$EuroCenten = array(10000,5000,2000,1000,500,200,100,50,20,10,5,2,1);
$MuntenArray = array();
echo $WisselBedrag.'<br/><br/>';
$WisselBedrag *= 100;
foreach($EuroCenten as $key => $value)
{ while($WisselBedrag >= $value)
{ $MuntenArray[$value] += 1;
$WisselBedrag -= $value;
}
}
foreach($MuntenArray as $key => $value)
{ echo $value.' x '.number_format($key/100, 2, ',', '').'<br/>';
}
?>
Je hoeft niet meerdere iteraties uit te voeren om eenzelfde bedrag meerdere keren af te trekken. In elke iteratie kun je zo'n veelvoud in één keer verwerken.
De oplossing voor 480 zou 2x200 + 1x50 + 1x20 + 1x10 moeten zijn lijkt mij.
Omdat je elke hoeveelheid maar 1x inspecteert zou je in principe kunnen volstaan met enkel een for-loop mits het beginbedrag een veelvoud is van (de som van) de beschikbare valutagroottes.
@SanThe: waarom die extra while? Dit kan ook met mod en div? En $MuntenArray[$value] wordt nergens geinitialiseerd?
Gewijzigd op 13/10/2016 15:17:06 door Thomas van den Heuvel
Dank je.
Toevoeging op 14/10/2016 09:56:36:
@- SanThe -
Ik kwam nog iets tegen wat niet goed gaat, op prijzen als:
4.85
1.15
4.60 (geeft die ook aan als 4.6)
gaat het niet goed, misschien meer maar deze kwam ik tegen.
Zou je nog eens kunnen kijken hoe dit op te lossen is dat het wel goed gaat want verder werkt alles zoals ik graag wil.
Dit is uit de errorlog, en blijkbaar gaat het soms ook mis bij de 10?
Backend log: PHP Notice:
Undefined offset: 10
Undefined offset: 5
P.S.
aangepast: $EuroCenten = array(200,100,50,20,10,5);
Sietsko
Toevoeging op 14/10/2016 13:57:15:
Ik weet niet als het een nette manier is, maar ik heb het opgelost door het bedrag af te ronden naar boven
$WisselBedrag = round($WisselBedrag);
Blijkbaar gaat het dus ergens mis met het eraf halen van een bedrag.
Gewijzigd op 14/10/2016 10:12:10 door Sietsko Bos
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$rBedrag = 99999.99;
$aMunt = [100000, 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1];
$aResultaat = array();
$teller = $rBedrag * 100;
$i = 0;
$noemer = $aMunt[$i];
print "<br/>Bedrag van $rBedrag ontbinden in zijn muntwaarden<br/><br/>";
while ($teller > 0) {
while ($teller < $aMunt[$i])
$i++;
$noemer = $aMunt[$i];
$aResultaat[] = [$noemer / 100, floor($teller/$noemer)];
$teller = $teller % $noemer;
}
foreach ($aResultaat as $row) {
print "$row[0] : $row[1]<br/>";
}
$aMunt = [100000, 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1];
$aResultaat = array();
$teller = $rBedrag * 100;
$i = 0;
$noemer = $aMunt[$i];
print "<br/>Bedrag van $rBedrag ontbinden in zijn muntwaarden<br/><br/>";
while ($teller > 0) {
while ($teller < $aMunt[$i])
$i++;
$noemer = $aMunt[$i];
$aResultaat[] = [$noemer / 100, floor($teller/$noemer)];
$teller = $teller % $noemer;
}
foreach ($aResultaat as $row) {
print "$row[0] : $row[1]<br/>";
}
Toevoeging op 16/10/2016 12:58:34:
Vraag aan Thomas:
"Dit kan ook met mod en div"
De modules operator MOD vind ik in PHP als "%".
Maar de divide operator DIV kan ik niet vinden.
In plaats daarvan wordt aangeraden de realdivide "/" (float in PHP) te gebruiken.
Dus om zeker te zijn van een integer als resultaat: floor($teller/$noemer).
Vraag is dus: hoe te DIV?
Gewijzigd op 15/10/2016 16:11:00 door Paul Ulje