Heey,

Ik ben aan het experimenteren met php.
Ik wil nu priemtweelingen maken, maar het werkt niet.
Zien jullie een fout?


		<u><h3>Priemtweelingen</h3></u>
		Vul hieronder de range van waar tot waar hij priemtweelingen moet gaan zoeken</br>
		
		
		<div  style="width: 500px; border: 1px solid black; margin: 8px; padding: 8px; ">						<!-- opmaak van de rand -->
			<form name="form2" method="post" action="priemtweelingen2.php">										<!--  hieruit haalt het phpscript "priemtweelingen2.php" de waardes -->
				<p>
					<table border="0">
						<tr>
							<td>
								Begin getal:
							</td> 
							<td>
								<input  type="text" name="begin_1" style="width: 150px;">						<!-- opmaak teksvakje plus naam die het vakje krijgt / hier wordt de beginwaarde ingegeven-->
							</td>
						</tr>
						<tr>
							<td>
								Eind getal:
							</td> 
							<td>
								<input align="middle" type="text" name="begin_2" style="width: 150px;">			<!-- opmaak teksvakje plus naam die het vakje krijgt  / hier wordt de eindwaarde ingegeven-->
							</td>
						</tr>							
					</table>
				</p>
	
				<p>
					<input type="submit" value="bekijk priemtweelingen">										<!-- stuurt de waardes door naar bovengenoemde address in de "action" -->
				</p>
			</form>
		</div>	


en mijn php:


<html>
	<head>
		
	</head>
	
	<body>
		
		<?php
		
		$begingetal = $_POST["begin_1"];
		$eindgetal = $_POST["begin_2"]; 
		
		for($i=$begingetal;$i<$eindgetal;$i++) 
			{
				for($j=1;$j<$eindgetal;$j++) 
				{
					$deel = $i/$j; 
					
					if(is_int($deel)) //"is_int" kijkt of er een numerieke
					{
					$var[$i][$j] = $deel;  
					} 
				}
			}

			foreach($var as $key => $waarde)
			{
				if((count($var[$key]) == 1 || (count($var[$key]) == 2)) && (count($var[$key+2]) == 1 || (count($var[$key+2]) == 2)))
				{            
					$priemgetallen = $key;
					echo "Dit  zijn ze $priemgetallen <br />";
					
				}
			}
			
			
		?>		
		
			
	</body>
</html>


























Bedankt alvast voor de hulp!

Mvg,
Camiel en Stan
Het punt is: je moet dit in een functie steken.
Je zoekt naar twee priemgetallen ... dan wil je toch een functie hebben die vraagt of 1 getal een priemgetal is, niet?

Stel, de buitenste lus staat op 987.
Dan wil je toch dit doen:

if (is_priemgetal(987) && is_priemgetal(989))

----
Dit is mijn versie, die ik zonet in mekaar heb gestoken
<?php
$max = 10000;

for ($i=0; ; $i++) {
if (is_prime($i) && is_prime($i + 2)) {
echo $i .' '. ($i + 2) .'<br>';
}
if ($i > $max) {
break;
}
}

function is_prime($number) {
$divisors = 0; // het aantal delers.
//Een priemgetal heeft twee verschillende delers; 1 en zich zelf (1 is geen priemgetal)
if ($number < 2) {
return false;
}
// laat ons 1 en $number zelf niet tellen. Dan is een priemgetal true indien $divisors 0 blijft.
// Een deler kan nooit groter zijn dan de helft van het nummer. Laat ons dus stoppen met tellen vanaf de helft
$half = floor($number / 2) + 1; // marge van 1 toevoegen
for ($i=2; $i<$half; $i++) {
if ($number % $i === 0) { // $a % $b | Modulus | Remainder of $a divided by $b.
return false;
}
}
return true;
}
?>

EDIT: Tja, die $divisors is eigenlijk helemaal niet nodig in deze context
Ik kwam op ongeveer dezelfde oplossing uit als Kris. Volgens mij kun je het algoritme optimaliseren door niet met $i++ te controleren of de volgende integer een priemgetal is, maar met gmp_nextprime($i) direct het volgende priemgetal na priemgetal $i te zoeken. Moet je alleen wel even GMP installeren.


<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Priemtweelingen</title>
</head>
<body>
<?php
if (
    isset($_GET['begingetal'], $_GET['eindgetal'])
    && is_numeric($_GET['begingetal'])
    && is_numeric($_GET['eindgetal'])
) {
    for ($i = (int) $_GET['begingetal']; $i <= $_GET['eindgetal']; $i++) {
        if (isPrime($i)) {
            $j = $i + 2;
            if (isPrime($j)) {
                echo '<p>{' . $i . ', ' . $j . '}</p>' ;
            }
        }
    }
}

/**
 * @see http://stackoverflow.com/questions/16763322/a-formula-to-find-prime-numbers-in-a-loop
 * @param int $num
 * @return bool
 */
function isPrime($num) {
    if ($num == 1) {
        return false;
    }
    if ($num == 2) {
        return true;
    }
    if ($num % 2 == 0) {
        return false;
    }
    for ($i = 3; $i <= ceil(sqrt($num)); $i = $i + 2) {
        if ($num % $i == 0) {
            return false;
        }
    }
    return true;
}
?>
  <form action="" method="get">
    <div>
      Begingetal: <br>
      <input name="begingetal" type="number">
    </div>
    <div>
      Eindgetal: <br>
      <input name="eindgetal" type="number">
    </div>
    <input type="submit" value="Zoeken...">
  </form>
</body>
</html>
$i = $i + 2
Lijkt me inderdaad een interessante zet.

ceil(sqrt($num))
ook. Die was ik vergeten.

Bedankt allemaal hij werkt!!!!

Reageren