Es sieht fast aus wie C++. Ich habe es auch ursprünglich damit geschrieben. Die Eingabe ist aber viel robuster.
Die vorgehensweise ist naiv. Die einzigen Optimierungen sind:
- Prüfung nur bis Wurzel(n)
- gerade Teiler und gerade (Prim-)Zahlen
werden ignoriert
Code:
import std.stream;
import std.math;
import std.stdio;
import std.string;
void eingabe(out uint min, out uint max)
{
char input[6];
do
{
writef("Untere Grenze: ");
scanf("%s", &input);
min = cast(uint) atoi(input);
writef("Obere Grenze: ");
scanf("%s", &input);
max = cast(uint) atoi(input);
}
while(min<3 || max<=min);
}
bit isPrime(uint zahl)
{
// Teiler bis wurzel(zahl) auf glatte Teilung prüfen
// alle Vielefache von 2 können ignoriert werden
uint grenze = cast(uint) sqrt(cast(real)zahl);
for(uint i=3; i<=grenze; i+=2)
{
if(zahl%i==0)
return false;
}
return true;
}
int main(char[][] args)
{
bit last_was_prime = false;
uint min,max;
// Bereich eingeben
eingabe(min,max);
// Alle ungeraden Zahlen im Bereich prüfen
// Bei der ersten ungeraden anangen
for(uint i = min%2==0 ? min+1:min; i<=max; i+=2)
{
if(isPrime(i))
{
if(last_was_prime)
writefln("%5d\t%5d", i-2, i);
last_was_prime = true;
}
else
{
last_was_prime = false;
}
}
return 0;
} War mein erster D Test.