Versio

Breuk vereenvoudigen

Overzicht Reageren

Rienus nvt

Rienus nvt

25/08/2010 09:51:37
Quote Anchor link
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
 
PHP hulp

PHP hulp

23/05/2012 23:35:23
Gesponsorde koppelingen:
 
Nicoow Unknown

Nicoow Unknown

25/08/2010 09:55:06
Quote Anchor link
als je goed controleerd kan je met eval() werken,
Maar onthou wel: eval = evil.
tenzij je erg goed controleerd, (alleen cijfers en /+-* toestaan
 
Rienus nvt

Rienus nvt

25/08/2010 10:04:49
Quote Anchor link
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
 
- Aar -

- Aar -

25/08/2010 10:12:08
Quote Anchor link
Je weet hoe eval() werkt?

http://nl2.php.net/eval
 
Joren de Wit
Beheerder

Joren de Wit

25/08/2010 10:16:04
Quote Anchor link
Eval() heb je eigenlijk nooit nodig, zo ook niet in dit geval:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$breuk
= '5/300';
list($nom, $denom) = explode('/', $breuk);

$uitkomst = $nom / $denom;
echo $uitkomst;
?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>
Gewijzigd op 25/08/2010 10:25:44 door Joren de Wit
 
Jens V

Jens V

25/08/2010 10:28:21
Quote Anchor link
Implementeer dit algortime:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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
 
Daniel Voogsgerd

Daniel Voogsgerd

25/08/2010 10:38:41
Quote Anchor link
@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 (:
Gewijzigd op 25/08/2010 10:41:02 door Daniel Voogsgerd
 
Joren de Wit
Beheerder

Joren de Wit

25/08/2010 10:56:31
Quote Anchor link
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?
 
Pim -

Pim -

25/08/2010 11:08:22
Quote Anchor link
@Daniel, dat is ook geen probleem, want het zoekt direct naar de ggd.
 
SilverWolf NL

SilverWolf NL

25/08/2010 11:14:49
Quote Anchor link
Kan veel makkelijker, als je GMP hebt:
http://php.net/manual/en/function.gmp-gcd.php

Ofterwijl:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$breuk
= '5/300';
list($nom, $denom) = explode('/', $breuk);

$gcd=gmp_gcd($nom,$denom);
echo ($nom/$gcd)."/".($denom/$gcd);
?>


Edit:

Heb net een functie gevonden waarmee je de GCD zelf uit kan rekenen, zonder GMP:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?PHP
function gcd($x, $y){
    $x = abs($x);
    $y = abs($y);
    if($x + $y == 0){
        return "0";
    }
else{
        while($x > 0){
            $z = $x;
            $x = $y % $x;
            $y = $z;
        }

        return $z;
    }
}

?>
Gewijzigd op 25/08/2010 11:21:43 door SilverWolf NL
 
Rienus nvt

Rienus nvt

26/08/2010 08:35:56
Quote Anchor link
Een ieder ontzettend bedankt voor zijn reactie. Hier kom ik een heel eind verder mee!

Gr,
Rienus
 



Overzicht Reageren