[PHP] checken of deling heel getal is?

Pagina: 1
Acties:
  • 521 views sinds 30-01-2008
  • Reageer

  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 09-10 13:11

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
Hi all, ik wil checken of het resultaat van een deling een heel getal is, oftewel geen breuk, doe je dat nu met het % teken of iets anders? als ik bv. test
PHP:
1
<?echo (18 % 14)?>

dan krijg ik 4 als uitkomst, dus ws. ben ik op zoek naar iets anders ... iemand die mij kan helpen?
TIA, Dr.B

NERDCORE FOR LIFE


  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 30-11 01:32

WOmBaT

Nyaaa!!!

Afronden en dan kijken of het gelijk is aan het getal dat je eerst had.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:58

Janoz

Moderator Devschuur®

!litemod

4 != 0 dus deling is niet geheel.. Wat is je probleem?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Idd... gewoon getal dat je door die % bekijken. Krijg je een lege string >> getal was heel. Geen lege string > getal was niet heel. Hoppa :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:58

Janoz

Moderator Devschuur®

!litemod

string???? We hebben het hier over getallen hoor... Gewoon ($a % $b == 0) en je hebt je test of de deling geheel zal zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • leonardo1504
  • Registratie: April 2001
  • Niet online
$a % $b Modulus Remainder of $a divided by $b.
ff zoeken op de PHP site naar operators
http://nl.php.net/manual/nl/language.operators.php

  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 30-11 01:32

WOmBaT

Nyaaa!!!

PHP:
1
<?//integer$int1=2;$int2=floor($int1);if ($int1==$int2) { echo "Integer"; }//geen integer$int1=2.2;$int2=floor($int1);if ($int1==$int2) { echo "Integer"; }?>

Zo werkt het toch gewoon? :)

Verwijderd

Op maandag 13 mei 2002 13:08 schreef Janoz het volgende:
string???? We hebben het hier over getallen hoor... Gewoon ($a % $b == 0) en je hebt je test of de deling geheel zal zijn.
Al die variabelen noem je toch strings? Naja ik iig wel, zal er idd wat beter op gaan letten. Het zijn idd getallen, maar ik d8 toch dat je het altijd strings noemde (sorry als ik 't fout had). iig leek me de bedoeling wel duidelijk.


(oeps, zelfs als mod kun je nog wel eens op het verkeerde knopje drukken |:( |:( |:( )

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:58

Janoz

Moderator Devschuur®

!litemod

Op maandag 13 mei 2002 13:13 schreef WOmBaT het volgende:
PHP:
1
<?//integer$int1=2;$int2=floor($int1);if ($int1==$int2) { echo "Integer"; }//geen integer$int1=2.2;$int2=floor($int1);if ($int1==$int2) { echo "Integer"; }?>

Zo werkt het toch gewoon? :)
Vergelijk:

if (($a/$b)==floor($a/$b)) echo "geheel";

en

if (($a%$b)==0) echo "geheel";

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 30-11 01:32

WOmBaT

Nyaaa!!!

Op maandag 13 mei 2002 13:16 schreef Janoz het volgende:

Vergelijk:

if (($a/$b)==floor($a/$b)) echo "geheel";

en

if (($a%$b)==0) echo "geheel";
Je hebt gelijk. Ik dacht dat het enkel om een integer-controle ging. Jouw manier klopt ook :*

  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 09-10 13:11

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
Op maandag 13 mei 2002 13:08 schreef Janoz het volgende:
string???? We hebben het hier over getallen hoor... Gewoon ($a % $b == 0) en je hebt je test of de deling geheel zal zijn.
Ja, dat dacht ik nu dan ook dat dat zou moeten werken, maar het gaat nog niet goed. Ik zal even m'n code laten zien:
PHP:
1
<?$hoogte = 200;$breedte = 300;echo "Verhouding is $hoogte : $breedte<hr>andere afmetingen:";$i = 1;while ($hoogte-$i > 0)  {    $value = $hoogte-$i;      if ($value % $breedte == 0) { echo $value." : ".($breedte/$value)."<br>"; }      $i++;    }?>

Misschien zit ik hier wel iets heeeel omslachtigs te doen, maar wat ik wil, is zonder al te veel moeite (ahum, ben er nu alweer een uurtje of 2 mee bezig ...) een rijtje uitpoepen van hele getallen die dezelfde verhouding hebben als het origineel (200:300 in dit geval). Maak ik misschien ergens een domme denkfout ofzo? Thanx all so far!

NERDCORE FOR LIFE


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:58

Janoz

Moderator Devschuur®

!litemod

Op maandag 13 mei 2002 13:16 schreef Egrimm het volgende:

[..]

Al die variabelen noem je toch strings? Naja ik iig wel, zal er idd wat beter op gaan letten. Het zijn idd getallen, maar ik d8 toch dat je het altijd strings noemde (sorry als ik 't fout had). iig leek me de bedoeling wel duidelijk.
String- een rij karakters.
Integer- een geheel getal met een maximum/minimum afhankelijk van waarin deze integer is opgeslagen (8, 16, 32 of 64 bit)
float- speciale representatie waarbij er een getal + een exponent wordt opgeslagen waardoor een veel groter bereik mogelijk is met een beperkte significantie.

Er zit fundamenteel verschil tussen dit soort types, maar doordat talen als php lose typing ondersteund (en van te voren dus niet vast staat wat voor type dfe verschillende vars zijn) hebben veel mensen die leren programeren met dit soort talen niet door waar ze eigenlijk mee besig zijn...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:58

Janoz

Moderator Devschuur®

!litemod

Waar je naar op zoek bent is de grootste gemene deler (ggd). Voor een algoritme zul je ff internet af moeten zoeken, maar dit is het grootste getal waardoor bijde getallen te delen is. In dit geval is dat honderd.

Vervolgens kun je een algoritme toepassen als dit:
code:
1
2
3
4
5
6
ggd=ggd(hoogte,breedte);
dh=hoogte/ggd;
db=breedte/ggd;
for (i=1;i<=ggd;i++){
  echo (dh*i)." x ".(db*i)."<br>";
}

Om de orginele afmeting niet mee te laten doen moet je ipv i<=ggd i<ggd gebruiken.


na wat zoeken een recursief algoritme voor ggd:
Deze grootste gemene deler (ggd) kan als volgt berekend worden. Als a gelijk is aan b, dan is ggd(a,b)=ggd(a,a)=a.

Als a verschillend is van b, stel bijvoorbeeld a groter dan b. Dan is ggd(a,b)=ggd(a-b,b). Dus het grootste getal a is vervangen door het grootste getal min het kleinste getal.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 09-10 13:11

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
Wow Janoz het is een mooi verhaal van je, maar ik snap er geen fuk van :) Ik heb mijn eigen code gecorrigeerd, zaten paar foutjes in, op zich werkt ie nu, alleen laat ie ook de getallen met breuk zien. Heb nu dit:
PHP:
1
<?$hoogte = 160;$breedte = 490;echo "Verhouding is $hoogte : $breedte <hr> andere afmetingen:<br>";$verh = $hoogte/$breedte;//BEREKENING:$i = 1;while ($hoogte-$i > 0)  {    $value = $hoogte-$i;        // HIER MOET IE DE NIET-HELE GETALLEN VOORKOMEN:        if ($value % $verh == 0) { echo $value." : ".$value/$verh."<br>"; }        $i++;    }?>

Heb nu iets 'lastiger' getallen genomen, anders kreeg ik wel heeel veel resultaten ....
Maar nu krijg ik dus (samenvatting):
Verhouding is 160 : 490
--------------------------------------------------------------------------------
andere afmetingen:
159 : 486.9375
158 : 483.875
157 : 480.8125
156 : 477.75
155 : 474.6875
154 : 471.625
153 : 468.5625
152 : 465.5
151 : 462.4375
150 : 459.375
149 : 456.3125
148 : 453.25
147 : 450.1875
146 : 447.125
145 : 444.0625
144 : 441
143 : 437.9375

etc.

NERDCORE FOR LIFE


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 10:43
Wil je die breuken niet zien dan ofzo ?

Verwijderd

De functie: is_int is misschien iets voor jou:

http://www.php.net/manual/en/function.is-int.php

  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 09-10 13:11

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
Op maandag 13 mei 2002 14:38 schreef ddc het volgende:
Wil je die breuken niet zien dan ofzo ?
Inderdaad, die resultaten met een breuk moet ie achterwege laten. Althans, daar wil ik op uitkomen. Zie jij wat ik verkeerd doe?

NERDCORE FOR LIFE


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 10:43
Hmm, geen idee, maar je kunt toch een simpele controle inbouwen of het een gebroken getal is ?

www.php.net/is_float

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Je gaat de fout in omdat je een float naar een modulo toe stuurt.
(verh is een float)

Modulo accepteert alleen gehele getallen

Wat probeer je eigenlijk te doen. Dus niet wat je nu aan het doen bent maar waar wil je dit script voor gebruiken. Wat is het doel van dit script.

Programmer - an organism that turns coffee into software.


  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 09-10 13:11

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
Op maandag 13 mei 2002 15:10 schreef LuCarD het volgende:
Je gaat de fout in omdat je een float naar een modulo toe stuurt.
(verh is een float)

Modulo accepteert alleen gehele getallen

Wat probeer je eigenlijk te doen. Dus niet wat je nu aan het doen bent maar waar wil je dit script voor gebruiken. Wat is het doel van dit script.
Wat is wil is dit: ik maak een filmpje in Flash die bv. de afmetingen 160 x 490 heeft. Maar aangezien Flash movies schaalbaar zijn, kan je in je code ook opgeven dat ie weergegeven moet worden als 144 bij 441. En zodoende wil ik dus _eenvoudig_ een lijstje genereren wat de andere mogelijke afmetingen zijn als het origineel 160 X 490 is.

Verder maakt jouw verhaal erg veel sense aangezien al m'n resultaten een FALSE krijgen op de is_int functie. Maar het begint me inmiddels dus erg te frustreren dat het niet zo simpel was als ik hoopte ... :)

NERDCORE FOR LIFE


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

PHP:
1
<?$value1=$deel1=160;$value2= $deel2=490;$rest=1;while ($rest != 0) {// Grootste gemeene deler    $rest=$deel1 % $deel2;    $deel1=$deel2;    $deel2=$rest;}for($i=0;$a<$value2 &amp;&amp; $p<$value1;$i++) {        $i++;    $a=$value1/$deel1 * $i;    $p=$value2/$deel1 * $i;    echo $value1,":",$value2," == ",$a,":",$p,"<BR>";} ?>

PS. 144 x 441 klopt niet... :)

Programmer - an organism that turns coffee into software.


  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 09-10 13:11

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
THANX voor je hulp, dat lijkt er heel erg op!

Maar: je hebt geen gelijk hoor volgens mij met 144:441.
Oftewel, jouw methode mist volgens mij een hoop gelijke verhoudingen ...

Jouw uitkomst:
16 : 49
48 : 147
80 : 245

Dan missen volgens mij:
32 : 98
64 : 196
96 : 294
112 : 343
128 : 392
en dus 144 : 441

mee eens?

NERDCORE FOR LIFE


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Je hebt helemaal gelijk.... :o

probeer deze maar eens
PHP:
1
<?$value1=$deel1=160;$value2= $deel2=490;$rest=1;while ($rest != 0) {    $rest=$deel1 % $deel2;    $deel1=$deel2;    $deel2=$rest;}$deel2=$value2/$deel1;$deel1=$value1/$deel1;for($i=0;$a<$value1 &amp;&amp; $p<$value2;$i++) {        $i++;    $a=$deel1 * $i;    $p=$deel2 * $i;    echo $value1,":",$value2," == ",$a,":",$p,"<BR>";?>

Programmer - an organism that turns coffee into software.


  • eborn
  • Registratie: April 2000
  • Laatst online: 12-12 14:43
Nog even voor de record:
PHP:
1
<?function groted( $a, $b ){    if( $a == $b )         return $a;    else    {        if( $a > $b )        {            $c = $b;            $b = $a;            $a = $c;        }        return groted( $b-$a, $a );    }}print "GGD: ".groted( 50, 100 );?>

uit het hoofd, dus incl. eventuele fouten ;)

  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 09-10 13:11

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
Uitkomst =
16:49
48:147
80:245
112:343
144:441
176:539

Komt wel in de buurt, maar mist er nog steeds een paar:
32:98
64 : 196
96 : 294
128 : 392

en ook - hahahaha, da's lachen - hij gaat te ver door, 176:539 is groter dan het origineel :)

Poe poe, het is niet zo simpel als het lijkt hè?

NERDCORE FOR LIFE


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

eborn:

Wat denk je het volgende doet?
PHP:
1
<?while ($rest != 0) {     $rest=$deel1 % $deel2;    $deel1=$deel2;    $deel2=$rest;}?>

Alleen dan sneller :)

Programmer - an organism that turns coffee into software.


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Op maandag 13 mei 2002 15:57 schreef Dr.Bob het volgende:
Uitkomst =
16:49
48:147
80:245
112:343
144:441
176:539

Komt wel in de buurt, maar mist er nog steeds een paar:
32:98
64 : 196
96 : 294
128 : 392

en ook - hahahaha, da's lachen - hij gaat te ver door, 176:539 is groter dan het origineel :)

Poe poe, het is niet zo simpel als het lijkt hè?
oops tik fout in de for lus staat een $i++ die moet weg.

En als je de optie 0:0 niet wilt hebben moet je $i op 1 laten beginnen... :)

Programmer - an organism that turns coffee into software.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:58

Janoz

Moderator Devschuur®

!litemod

Op maandag 13 mei 2002 15:57 schreef Dr.Bob het volgende:
Uitkomst =
16:49
48:147
80:245
112:343
144:441
176:539

Komt wel in de buurt, maar mist er nog steeds een paar:
32:98
64 : 196
96 : 294
128 : 392

en ook - hahahaha, da's lachen - hij gaat te ver door, 176:539 is groter dan het origineel :)

Poe poe, het is niet zo simpel als het lijkt hè?
Er staat een $i++ teveel in.. Daarom slaat ie d'r altijd 1tje over...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • eborn
  • Registratie: April 2000
  • Laatst online: 12-12 14:43
Op maandag 13 mei 2002 15:58 schreef LuCarD het volgende:
eborn:

Wat denk je het volgende doet?
PHP:
1
<?while ($rest != 0) {     $rest=$deel1 % $deel2;    $deel1=$deel2;    $deel2=$rest;}?>

Alleen dan sneller :)
Nu je het zegt, dit komt me ook wel iets bekende voor ;) Maar goed, was wel weer even leuk om te proggen :P

  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 09-10 13:11

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
Op maandag 13 mei 2002 16:00 schreef LuCarD het volgende:

[..]

oops tik fout in de for lus staat een $i++ die moet weg.

En als je de optie 0:0 niet wilt hebben moet je $i op 1 laten beginnen... :)
PERFECT, thanx a lot LuCarD, het werkt helemaal. Ik ga me er nu dan maar even in verdiepen om te kijken _waarom_ het werkt :) Thanx for your help, en de rest ook uiteraard.

NERDCORE FOR LIFE

Pagina: 1