Breuk vereenvoudigen
Beste PHP-hulpers,
Is het mogelijk om op een makkelijke wijze een breuk te vereenvoudigen in PHP?
Ik krijg de breuk aangeleverd als een string. Bijvoorbeeld "5/300".
Gr,
Rienus
Is het mogelijk om op een makkelijke wijze een breuk te vereenvoudigen in PHP?
Ik krijg de breuk aangeleverd als een string. Bijvoorbeeld "5/300".
Gr,
Rienus
als je goed controleerd kan je met eval() werken,
Maar onthou wel: eval = evil.
tenzij je erg goed controleerd, (alleen cijfers en /+-* toestaan
Maar onthou wel: eval = evil.
tenzij je erg goed controleerd, (alleen cijfers en /+-* toestaan
Ha Nico,
Bedankt voor je reactie. Indien ik het doe met eval, dan krijg ik de volgende error.
$breuk = eval("5/300");
Parse error: parse error in C:\wamp\www\test\index.php(12) : eval()'d code on line 1
Gr,
Rienus
Bedankt voor je reactie. Indien ik het doe met eval, dan krijg ik de volgende error.
$breuk = eval("5/300");
Parse error: parse error in C:\wamp\www\test\index.php(12) : eval()'d code on line 1
Gr,
Rienus
Eval() heb je eigenlijk nooit nodig, zo ook niet in dit geval:
Toevoeging op 25/08/2010 10:26:19:
Uiteraard kun je er wel zelf een functie voor schrijven. Volgens mij moet dit in alle gevallen werken:
Code (php)
Edit:
Dit geeft alleen maar de decimale uitkomst van de breuk. Voor zover ik weet is er geen bestaande functie in PHP op de breuk te vereenvoudigen tot (in dit geval) 1/60.
Toevoeging op 25/08/2010 10:26:19:
Uiteraard kun je er wel zelf een functie voor schrijven. Volgens mij moet dit in alle gevallen werken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
function vereenvoudig($breuk) {
if(!is_string($breuk) || substr_count($breuk, '/') != 1) {
return false;
}
else {
list($nom, $denom) = explode('/', $breuk);
for($i = $nom; $i > 0; $i--) {
if(is_int($denom / $i) && is_int($nom / $i)) {
$new_nom = $nom / $i;
$new_denom = $denom / $i;
break;
}
}
return $new_nom.'/'.$new_denom;
}
}
$breuk = '5/300';
echo vereenvoudig($breuk);
?>
function vereenvoudig($breuk) {
if(!is_string($breuk) || substr_count($breuk, '/') != 1) {
return false;
}
else {
list($nom, $denom) = explode('/', $breuk);
for($i = $nom; $i > 0; $i--) {
if(is_int($denom / $i) && is_int($nom / $i)) {
$new_nom = $nom / $i;
$new_denom = $denom / $i;
break;
}
}
return $new_nom.'/'.$new_denom;
}
}
$breuk = '5/300';
echo vereenvoudig($breuk);
?>
Gewijzigd op 25/08/2010 10:25:44 door Joren de Wit
Implementeer dit algortime:
Wiki is je - speciaal voor Daniel Voogsgerd - goede vriend! (Stiekem toch beste hoor ;) )
Met vriendelijke groeten,
Jens
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Bij het vereenvoudigen van een breuk is het handig om de ggd te bepalen.
Het getal boven en onder de breuk (respectievelijk de teller en de noemer) kan dan door de g.g.d worden gedeeld
en zo verkrijgt men direct de grootst mogelijke vereenvoudiging.
De breuk 24/102 wordt aldus vereenvoudigd tot 4/17.
Een breuk van twee relatief prieme getallen kan niet vereenvoudigd worden.
Bijvoorbeeld: verklein 75/105:
75= 3x5x5
105= 3x5x7
Wat hebben ze gemeen? Het product 3x5.
Wat blijft er over? Bij 75 de factor 5 en bij 105 de factor 7.
75/105= 5/7
Het getal boven en onder de breuk (respectievelijk de teller en de noemer) kan dan door de g.g.d worden gedeeld
en zo verkrijgt men direct de grootst mogelijke vereenvoudiging.
De breuk 24/102 wordt aldus vereenvoudigd tot 4/17.
Een breuk van twee relatief prieme getallen kan niet vereenvoudigd worden.
Bijvoorbeeld: verklein 75/105:
75= 3x5x5
105= 3x5x7
Wat hebben ze gemeen? Het product 3x5.
Wat blijft er over? Bij 75 de factor 5 en bij 105 de factor 7.
75/105= 5/7
Wiki is je - speciaal voor Daniel Voogsgerd - goede vriend! (Stiekem toch beste hoor ;) )
Met vriendelijke groeten,
Jens
Gewijzigd op 25/08/2010 10:40:23 door Jens V
@Blanche
Volgens mij vereenvoudigd het script dat jij plaatst alle breuken maar één keer. En het script kan een breuk met een hogere waarde dan twee niet aan.
@Jens
Wiki is een goede vriend maar google is je beste vriend (:
Volgens mij vereenvoudigd het script dat jij plaatst alle breuken maar één keer. En het script kan een breuk met een hogere waarde dan twee niet aan.
@Jens
Wiki is een goede vriend maar google is je beste vriend (:
Gewijzigd op 25/08/2010 10:41:02 door John Doe
Daniel, hoe bedoel je dat. Als ik bijvoorbeeld de breuk 1368/13338 neem, wordt dat netjes vereenvoudigd naar 4/39...
Kun je een voorbeeld geven van een breuk die volgens jou niet goed vereenvoudigd zou worden?
Kun je een voorbeeld geven van een breuk die volgens jou niet goed vereenvoudigd zou worden?
@Daniel, dat is ook geen probleem, want het zoekt direct naar de ggd.
Kan veel makkelijker, als je GMP hebt:
http://php.net/manual/en/function.gmp-gcd.php
Ofterwijl:
http://php.net/manual/en/function.gmp-gcd.php
Ofterwijl:
Code (php)
Edit:
Heb net een functie gevonden waarmee je de GCD zelf uit kan rekenen, zonder GMP:
Heb net een functie gevonden waarmee je de GCD zelf uit kan rekenen, zonder GMP:
Code (php)
Gewijzigd op 25/08/2010 11:21:43 door SilverWolf NL
Een ieder ontzettend bedankt voor zijn reactie. Hier kom ik een heel eind verder mee!
Gr,
Rienus
Gr,
Rienus




