Primzahlen berechnen in Java?
Hallo,
ich versuche derzeit ein Programm zu schreiben, das mir Primzahlen errechnet. Es lässt sich auch fehlerfrei kompilieren, aber Primzahlen kommen keine raus. Anscheinend wird das Ergebnis automatisch abgerundet. Ich wäre sehr froh, wenn ihr mir den Fehler (oder die Fehler :-) ) aufzeigen könntet oder mir eine bessere Methode schreiben würdet.
public class Primzahlen {
public static void main (String[] args) {
int Zahl = 13;
double d1;
for(int i = 2; i < Zahl; i++) {
d1 = Zahl/i;
int i1 = (int) d1;
System.out.println(d1-i1 + " Ergebnis " + Zahl+ "/" + i + ": " + d1 + " Zahl: " + Zahl + " Divisor: " + i);
if ((d1 - i1) == 0.0) {
System.out.println(Zahl + " ist keine Primzahl, sie ist durch " + i + " teilbar.");
break;
} else {
if ((i+1) == Zahl) {
System.out.println(Zahl + " ist eine Primzahl");
break;
}
}
}
}
}
Kompilierte Version und Quellcode: http://db.tt/nRNKnOQ2
5 Antworten
using namespace std;
int main() { bool bPrime; long lngFrom; long lngTo;
cout << "Von: "; cin >> lngFrom; cout << "Bis: "; cin >> lngTo;
for (int a = lngFrom; a <= lngTo; a++) { bPrime = true; for (int b = 2; b < a; b+=2 /b++/) { if (a % b == 0) { bPrime = false; break; } } if (bPrime) cout << "Die Zahl: " << a << "\tist eine Primzahl!\n"; } cin.get(); return 0; }
versuchs mal in etwa so:
import java.lang.Math;
public class prime {
public static void main (String[] args) {
int Zahl = 12;
int r = (int) Math.ceil(Math.sqrt((double)Zahl));
boolean isprime = true;
if (Zahl % 2 ==0) {
System.out.println(Zahl + " ist keine Primzahl, sie ist durch 2 teilbar.");
isprime = false;
}
for(int i = 3; i < r; i=i+2) {
if (Zahl %i == 0) {
isprime = false;
System.out.println(Zahl + " ist keine Primzahl, sie ist durch " + i + " teilbar.");
break;
}
}
if (isprime) {
System.out.println(Zahl + " ist eine Primzahl");
}
}
}
das ist extrem ineffizient.
- du brauchst nur die teiler bis Wurzel(zahl) prüfen.
- wenn du die 2 gesondert betrachtest, reicht es, nur ungerade teiler zu prüfen.
- rechne modulo, dann kannst du auf den integern bleiben, also, if (zahl % i ==0), dann teilt i die zahl
man kann weiter optimieren, aber das ist ein anfang :)
Java rundet grundsätzlich auf Integer, wenn nur Integerzahlen auf der rechten Seite vorkommen. d.h. bei
d1 = Zahl / i;
wird gerundet. Baust du einen cast ein, funktioniert es wie gedacht:
d1 = (double) Zahl / i;
Hab gerade zwar kein Java zur Hand aber ich denke in der Zeile d1 = Zahl/i; müsste es d1 = (double)Zahl/i; heißen.
Desweiteren solltest du dich mal in das Thema Modulo einlesen, dieser Operator könnte dir hier wahrscheinlich behilflich sein, denn er kann leicht dazu genutzt werden, um zu überprüfen, ob man eine Zahl restlos teilen kann bzw. welcher Rest übrig bleibt.