Het is weer een tijdje geleden dat ik nog php heb geschreven. Ik dacht het wat op te frissen door de uitdagingen van het Euler Project (projecteuler.net) aan te gaan.

En bij mijn eerste script loopt het al fout. Ik heb een default installatie van Wamp Server en volgend script:


<?php
$addDrie = 0;
$addVijf = 0;
$result = 0;
$end = 10;
$goDrie = true;
$goVijf = true;

while ($i = 1; $goDrie && $goVijf; $i++) {
	$addDrie = $i * 3;
	$addVijf = $i * 5;
	if ($addDrie < $end) {
		$aSum[] = $addDrie;
	} else {
		$goDrie = false;
	}
	if ($addVijf < $end) {
		$aSum[] = $addVijf;
	} else {
		$goVijf = false;
	}
}

foreach ($aSum as $s) {
	$result += $s;
}

echo "De som is $result";
?>


Hij loopt vast op lijn 2. :s
Armaron schreef op 17.12.2009 17:48

Hij loopt vast op lijn 2. :s

Wat loopt vast? Je PC?
Je while() is vreemd.

Zet dit bovenin je script.
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);

// rest
?>
Extra code staat erin. De enige error die ik blijf krijgen is:

Parse error: parse error in C:\wamp\www\Euler\Euler1.php on line 2
Maak van while() eens for().
Ik was me wat aan het vervelen. Een iets andere manier om alles te berekenen.

Edit: Ik heb de oorspronkelijke vraag nagekeken en het lijkt erop dat hij niet werkt waarvoor hij bedoeld is.


<?php

	#| Berekenen tot.
	
		$end = 10;
	
	
	#| De tafeltjes van drie tot " $end ".
	
		$drie = range(3, $end, 3);
		
	
	#| De tafeltjes van vijf tot " $end ".
		
		$vijf = range(5, $end, 5);
	
	
	#| Verschillende tafeltjes samen voegen. " Drie plus Vijf in dit geval "
		
		$aSum = array_merge($drie, $vijf);


	#| De som van " $aSum " weergeven.
	
		echo 'De som is '.array_sum($aSum);
		
?> 
@Mark: jou code clopt niet. Volgens het Euler Project moet de som 23 zijn als je 10 als max neemt. Met jou code kom je op 33. Het einddoel is om het maximum op 1000 te zetten.

Deze code werkt en geeft een juist resultaat voor een end van 10, maar niet voor die van 1000.


<?php
$end = 1000;
$goDrie = true;
$goVijf = true;

for ($i = 1; $goDrie || $goVijf; $i++) {
	$drie = $i * 3;
	$vijf = $i * 5;
	
	if ($drie < $end) {
		$aSum[] = $drie;
	} else {
		$goDrie = false;
	}
	if ($vijf < $end) {
		$aSum[] = $vijf;
	} else {
		$goVijf = false;
	}
}

echo "het resultaat is " . array_sum($aSum);
?>
<?php
$end = 1000;
$goDrie = true;
$goVijf = true;

for ($i = 1; $goDrie || $goVijf; $i++) {
    $drie = $i * 3;
    $vijf = $i * 5;
    
    if ($drie < $end) {
       if ($drie < $end) {$aSum[] = $drie;}
    } else {
        $goDrie = false;
    }
    if ($vijf < $end) {
        if ($vijf < $end) { $aSum[] = $vijf;}
    } else {
        $goVijf = false;
    }
}

echo "het resultaat is " . array_sum($aSum);
?>



Misschien dat?

<?php

$x = 1000;
echo 1.5 * (int) ( ( $x-1 ) / 3 ) * ( int ) ( ( $x + 2 ) / 3 ) + 2.5 *( int ) ( ( $x-1 ) / 5 ) * ( int ) ( ( $x + 4) / 5) - 7.5 * ( int ) ( ( $x - 1 ) / 15 ) * ( int ) ( ( $x + 14 ) / 15 ); 

?>
@Joris: dan doe je gewoon 2 dezelfde checks en neem je alleen meer processorkracht in. Maakt geen verschil. :)

@Stefan: ik kom op hetzelfde resultaat. Raar.
Lees mijn editje, die werkt.
@ amaron,
Nee hoor. Dat is niet waar. Want kijk:
Eerst check je of het nummer hoger is dan wat het mag zijn.
Als dat niet zo is verander je het nummer. (dus keer 3 ofzo)
Daarna voeg je hem gelijk toe;;

maar dat moet niet, want dan mag het getal nog steeds niet hoger zijn.

Dus dat geeft wel degelijk een andere werking aan het script.

Reageren