Priemtweelingen
Heey,
Ik ben aan het experimenteren met php.
Ik wil nu priemtweelingen maken, maar het werkt niet.
Zien jullie een fout?
en mijn php:
Bedankt alvast voor de hulp!
Mvg,
Camiel en Stan
Ik ben aan het experimenteren met php.
Ik wil nu priemtweelingen maken, maar het werkt niet.
Zien jullie een fout?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<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>
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<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>
<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
EDIT: Tja, die $divisors is eigenlijk helemaal niet nodig in deze context
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?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;
}
?>
$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
Gewijzigd op 06/12/2013 11:25:45 door Kris Peeters
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<!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>
<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.
Lijkt me inderdaad een interessante zet.
ceil(sqrt($num))
ook. Die was ik vergeten.
Bedankt allemaal hij werkt!!!!




