login  Naam:   Wachtwoord: 
Registreer je!
 Forum

getallenreeks (Opgelost)

Offline timo - 12/06/2007 15:16
Avatar van timoPHP ver gevorderde Hoe kan ik met PHP het volgende berekenen:
we hebben de volgende getallenreeks: 1,2,2,3,3,3,4,4,4,4,5,5,5,5,5 etc

dus elk getal komt zijn eigen waarde zo vaak er te staan (100 komt er 100x te staan)

hoe kan ik nu berekenen welk getal het 2006de in deze reeks is (heb hierboven ter voorbeeld 6 vet gedrukt, zo moet ik dus de 2006de eruit vissen)

iemand enig idee hoe ik dit met PHP doe?

10 antwoorden

Gesponsorde links
Offline vinTage - 12/06/2007 15:20
Avatar van vinTage Nieuw lid in een array zetten en index 2005 echoen ?
Offline Thomas - 12/06/2007 15:26 (laatste wijziging 12/06/2007 16:39)
Avatar van Thomas Moderator euhhhh... for-lus?

...opss...

Edit: ow vraag verkeerd gelezen, maar het principe blijft hetzelfde.
Maak een lus met een conditie.

  1. $index = ...;
  2. $counted = 0;
  3. $the_number = 0; // init op 0
  4. $are_we_there_yet = false;
  5.  
  6. while(!$are_we_there_yet) {
  7. $counted += $the_number;
  8. $the_number++;
  9. // zit de gezochte index in het volgende interval?
  10. $are_we_there_yet = $index >= $counted && $index < $counted+$the_number+1;
  11. }


Zoiets... na afloop heeft $the_number het gezochte nummer.

Of een binary search.
Offline Abbas - 12/06/2007 16:51 (laatste wijziging 12/06/2007 16:52)
Avatar van Abbas Gouden medaille

Crew .NET
Ik heb een manier gevonden, maar bij zo'n grote getallenreeks krijg ik dit: "Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 35 bytes) in C:\xampp\htdocs\loop.php on line 11"!!!

Dit is de code:

  1. <?php
  2.  
  3. for($i = 1; $i < 2007; $i++)
  4. {
  5. for($x = $i; $x > 0; $x--)
  6. {
  7. $var .= $i.";";
  8. }
  9. }
  10.  
  11. $array = explode(";", $var);
  12. echo $array[2005];


Als ik in plaats van $i < 2007, bvb. $i < 200 neem en dan van de array het 20e element neem werkt het perfect, het twintigste getal is een 6. 
Offline Thomas - 12/06/2007 16:58
Avatar van Thomas Moderator Mijn code werkt bij 2007 ook nog wel denk ik .
Offline ikkedikke - 12/06/2007 17:01
Avatar van ikkedikke PHP expert probeer het eens algebraïsch:
n(2n+1) > 2006
Hierin is 2N het getal dat je zoekt.
Wat je eigenlijk doet is het volgende:
het getal 1 voegt 1 getal toe, 2 2 enz.
Je moet dus een reeks hebben die 2006 lang is, of langer.
dit bereken je als volgt:
Tel de eerste en de laatste op, en vermenigvuldig dat met de helft van de laatste.
Offline Yopi - 12/06/2007 17:13
Avatar van Yopi Nieuw lid De code van titjes heeft ook geen problemen met het 2006e element wanneer je $i < 200 neemt.
Dan bevat het array al ruim 20.000 elementen.

Het 2006e element zou 63 moeten zijn.
Offline Abbas - 12/06/2007 17:21 (laatste wijziging 12/06/2007 17:41)
Avatar van Abbas Gouden medaille

Crew .NET
@hierboven: inderdaad, je hebt gelijk. Mijn code werkt ook Het 2006e getal is 63...

Ik heb mijn script aangepast zodat je niet gebonden zit aan die $i < 200...
  1. <?php
  2.  
  3. $i = 1;
  4.  
  5. while($aantal < 2007)
  6. {
  7. $i++;
  8. for($x = $i; $x > 0; $x--)
  9. {
  10. $var .= $i.";";
  11.  
  12. }
  13. $array = explode(";", $var);
  14. $aantal = count($array);
  15. }
  16.  
  17. echo $array[2005];
  18.  
  19. ?>


Dit geeft hetzelfde resultaat, als je nu bvb. het 1385ste element wilt weten verander je de 2007 in 1386 en de $array[2005] in $array[1384]. Mijn vorig script werkt ook perfect zolang je niet het 19902e element moet weten want dan ben je met die $i < 200 niets meer en kan je beter dit gebruiken... 
Offline Yopi - 12/06/2007 19:37
Avatar van Yopi Nieuw lid Nog een mogelijke oplossing zonder lussen:

  1. <?
  2. $index = 2006;
  3.  
  4. // Formule: 0.5n^2 + 0.5n - $index = 0 (ABC formule)
  5. $D = 0.25 + 2 * $index; // Discriminant
  6. $opl = -0.5 + sqrt($D); // (-b + D^0.5) / 2a
  7.  
  8. print ceil($opl);
  9. ?>
Offline timo - 13/06/2007 17:11
Avatar van timo PHP ver gevorderde het ging om die 63;-) bedankt voor al jullie oplossingen, wiskunde is een mooi vak, ain't it?
Offline Thomas - 19/06/2007 09:29
Avatar van Thomas Moderator Het kan nog eenvoudiger denk ik...
Je moet namelijk het aantal indexen van de reeks weten, en die zijn eenvoudig bij te houden.

  1. <?
  2. $looking_for_index = 2006; // de te zoeken index
  3. $counted_indexes = 0;
  4. $current_index = 0;
  5.  
  6. while($looking_for_index < $counted_indexes)
  7. {
  8. $current_index++;
  9. $counted_indexes += $current_index;
  10. }
  11. // nu geldt $looking_for_index >= $counted_indexes,
  12. // dus $current_index bevat (hopelijk) de goede waarde
  13. ?>


Volgens mij is dit voldoende?
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.229s