Problem mit der oberen Grenze

heathcliff

Mitglied
Schönen Advent allerseits!

ich bin ein purer Anfänger in Java wollte euch gerne mal fragen, wie man eine bestimmte Anzahl von Ergebnissen in Java wiedergibt.:rtfm:
Ich habe es mit der if-Schleife + return versucht jedoch zeigt er mir jedesmal einen Fehler an, und ich wüsste nicht wo es hakt, denn die Rekursion erscheint mir eig richtig an der Stelle.
Ich wünsche euch noch einen schönen Sonntagabend und einen schönen 3.Advent🙂
[JAVA=42]
public class prim {
public static void main(String []args)
{
int N = Integer.parseInt(args[0]);
boolean[] prim = new boolean[N];
prim[0]=false;

for (int i = 1; i <N; i++)
{ prim=true;
}

for (int i=2;i<=N;i++){
if(prim[i-1]){
System.out.println(i);

for(int j=i*i;j<=N;j+=i){
prim[j-1]=false;
if(i<=N){
return N*10;
}
}

}


}
}
}
[/code]
 
Hallo 🙂

Kannst du genauer beschreiben, was du mit "wiedergibt" meinst? Die return-Anweisung funktioniert an der Stelle nicht, weil die main-Methode keinen Rückgabewert hat. An wen möchtest du den Wert n * 10 denn zurückgeben? Wenn du ihn ausgeben möchtest, kannst du das mit System.out.println tun. Aber da du das an anderer Stelle benutzt, gehe ich davon aus, dass du etwas anderes machen möchtest - aber was? 🙂

PS: Es gibt keine if-Schleifen. Schleifen führen etwas mehrfach aus, bei der if-Anweisung wird es aber maximal einmal ausgeführt 😉
 
Hallöchen 🙂
Ich möchte gerne den N-Wert erhöhen, sodass er am Ende nicht die Primzahlen bis 6 wiedergibt, was in meinen Fall es wäre, sondern das sich die Grenze also N * 10 gerechnet wird, da es vorgegeben wurde und dann sozusagen ich meine 6 ersten Primzahlen rausbekomme. Dies würde ich gerne als if bzw return schleife machen da ich für jedes N es dürchführen möchte. 🙂
Danke für die schnelle Antwort!:toll:
 
Hm. Du liest momentan am Anfang N als Eingabe für das Programm ein und berechnest dann die Primzahlen bis N, die auch ausgegeben werden. Wenn du momentan von außen N = 6 übergibst, kannst du doch auch stattdessen N = 60 oder beliebige andere Werte übergeben?
 
ich habs vielleicht es falsch formuliert. Also der Wert N den ich eingebe, soll sozusagen die ersten N-Primzahlen wiedergeben. Sprich bei der Eingabe von N=1 soll 2 rauskommen und bei N=2 sollen 2,3 rauskommen.🙂
Ich entschuldige mich für meine schlechte Ausdrucksweise 🙂))
 
Ah, okay. Und da du momentan die Primzahlen bis N und nicht die ersten N Primzahlen berechnest, bist du unzufrieden und verbringst deinen Advent mit Primzahlen, verstehe 🙂

Dazu könntest du z.B. mitzählen, wie viele Primzahlen bisher berechnet wurden - also eine neue Variable einführen, die mit 0 initialisiert wird und immer erhöht wird, wenn du eine Primzahl ausgibst. Damit die Ausgabe beim Erreichen von N beendet wird, kannst du mit einer if-Abfrage prüfen, ob dieser Zähler den Wert von N erreicht hat. Falls Ja, kannst du mit dem Schlüsselwort "break" die Schleife verlassen. "return" ginge auch, dann wird sofort das ganze Programm beendet.
 
Herzliches Dankeschön für deine Hiöfe 🙂
Ja der Advent wird genutzt um zu lernen bei mir 😀
Aufjedenfall hab ich jetzt ne ahnung wie ich das Ganze angehen muss.
Ich wünsche dir noch einen schönen Restsonntag🙂
Modifiziere nun meine Methode etwas 😀
 
iwie klappt das so gar nicht mit dem zählen 🙁
[JAVA=42]
public class prime {
public static void main(String []args)
{
int N = Integer.parseInt(args[0]);
int M=9;
boolean[] prim = new boolean[M];

prim[0]=false;
int a=0;
for (int i = 1; i <M; i++)
{ prim=true;
}
for (int i=2;i<=M;i++){
if(prim[i-1]){
System.out.println(i);


for(int j=i*i;j<=M;j+=i){
prim[j-1]=false;
M*=10;
a++;
if (i==N) break; else
return a ;
}

}

[/code]
 
Fehler 1: Du zählst jetzt zwar fleißig in a die Anzahl der berechneten Primzahlen, vergleichst aber dann i mit N. i ist aber nur die aktuelle Primzahl, das wollte du ja gerade nicht.

Fehler 2: Das [c]else return a;[/c] kann ganz weg. Du kannst aus main wie gesagt keinen Wert zurückgeben. Außerdem interessiert dich der Wert von a ja auch nicht weiter, da er am Ende genau der Eingabe N entspricht. Mir fällt allerdings gerade auf, dass du ja verschachtelte Schleifen benutzt - dann sollte statt break doch lieber return verwendet werden, da du sonst nur die innere Schleife verlässt.

Insgesamt also so zu lösen:

Java:
if (a==N) {
  return;
}
 
ich habe i mit N verglichen,weil i ja sozusagen bei mir schon 3 Werte ausgibt. Deswegen dachte ich mir ich erhöhe a, damit ich sozusagen mein M erhöhen kann, sodass ich dann eine höhere Grenze habe und somit i= N habe.
Ich habe deinen Lösungsvorschlag eingegeben und habe dann erst realisiert dass mein i mehr werte ausgibt.
 
Ist dein Adventswunsch damit denn erfüllt? Ich bin mir weiterhin nicht ganz sicher, ob ich deinen Wunschzettel richtig interpretiert habe und ob du nun glücklich bist :/
 
"ich habe i mit N verglichen,weil i ja sozusagen bei mir schon 3 Werte ausgibt. Deswegen dachte ich mir ich erhöhe a, damit ich sozusagen mein M erhöhen kann, sodass ich dann eine höhere Grenze habe und somit i= N habe.
Ich habe deinen Lösungsvorschlag eingegeben und habe dann erst realisiert dass mein i mehr werte ausgibt."
Doch, da du mir hilfst 😀
und glücklich naja es läuft iwie immernoch nicht 😀
du hast mich schon richtig verstanden bloß glaube ich, dass meine Methode von vorne bis hinten falsch :/
i entspricht bei mir nicht einen wert sondern gleich 3. Ich weiß nicht wie ich das dann hochzählen soll, da der i wert sozusagen vor der if bedingung kommt und dann kein platz im array mehr ist.
 
Irgendwie unterscheiden sich unsere Denk- und Sprechweisen glaube ich fundamental, denn ich muss über deine Beiträge mehrmals nachdenken und verstehe sie trotzdem nicht ganz.. aber vielleicht liest noch jemand mit, der dich genau versteht? 🙂
 
Ich könnte dir ja mal die Aufgabenstellung erläutern vllt hilfts ja : Ich soll Primzahlen mithilfe des Siebes von Erastothenes ermitteln. und halt N soll sagen, dass N primzahlen ausgeben soll.😀
 
Oh. Dafür ist das Sieb des Erastothenes aber eine ziemlich schlechte Wahl, fällt mir gerade auf: Da musst du ja vor der Berechnung eigentilch eine Obergrenze haben, bis wohin die Primzahlen berechnet werden sollen. Wenn du da 100 nimmst, werden aber nur die Primzahlen bis 100 berechnet - von den ersten 100 Primzahlen gehen aber welche deutlich über 100 hinaus. Jetzt verstehe ich glaube ich, welches Problem du mit dem Array meintest. Dir fehlt dann einfach der Platz im Array.

Du brauchst also eine Abschätzung, bis zu welcher Zahl du Primzahlen berechnen musst, damit die ersten n Primzahlen darunter sind. Die liefert beispielsweise der Primzahlsatz von Gauß. Oder übersehe ich was?
 
Ja genau aber bei uns ist es vorgegeben den Sieb des Erasthothenes zu verwenden. und ja genau da liegt das problem an meiner Methode ich glaube wir verstehen uns langsam 😀
Und ich erhöhe ja sozusagen meine obere Grenze, indem ich ja sage wenn es noch nicht genug primzahlen ausgelesen werden dann erhöhe die Obere Grenze um den Faktor 10. und ich soll bei 10 anfangen 🙂
 
Das ist natürlich möglich, aber dann musst du ja nochmal von vorn anfangen und alle Primzahlen nochmal berechnen, obwohl du sie schon hattest 😱 Dadurch wird die Laufzeit erheblich ansteigen. Aber nagut.

Dann wäre eine mögliche Lösung, noch eine zusätzliche Schleife einzuführen - z.B. eine do-while-Schleife, die am Ende prüft, ob die Anzahl der Primzahlen erreiche wurde und ansonsten nochmal von vorn anfängt, aber mit einem höheren N.
 

Zurück
Oben