Primzahlen

Xanth
Hi,

ich möchte mir ein Programm schreiben, was JEDE PRrimzahl von 1 bis unendlich ausrechnet, wenn ich es beende das der sich die Zahl merkt und beim nächsten starten des Programmes der ab dem letzten Stand weiter reechnet. Und man soll die Primzahlen speichern können.

Hier mal der Code:

Public Class frmMain
Private strPrimzahlen As String
Private Primzahl As Integer
Private geändert As Boolean
Private Sub cmdrechnen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdrechnen.Click
lstPrimzahlen.Items.Clear()
lstPrimzahlen.Items.Add(2)
bg.RunWorkerAsync()
End Sub
Private Sub bg_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bg.DoWork
Dim n As Integer
If Val(txtto.Text) = -1 Then
n = 3
While bg.CancellationPending = False
Dim isprimzahl As Boolean = True
If n / 2 = Math.Round(n / 2) Then isprimzahl = False
If n / 3 = Math.Round(n / 3) Then isprimzahl = False
If n / 5 = Math.Round(n / 5) Then isprimzahl = False
If n / 7 = Math.Round(n / 7) Then isprimzahl = False
If n = 3 Then isprimzahl = True
If n = 5 Then isprimzahl = True
If n = 7 Then isprimzahl = True
If isprimzahl Then
geändert = True
Primzahl = n
strPrimzahlen &= n & vbCrLf
bg.ReportProgress(1)
Threading.Thread.Sleep(1)
End If
n += 2
End While
Else
For n = 3 To Val(txtto.Text) Step 2
If bg.CancellationPending Then Exit For
Dim isprimzahl As Boolean = True
If n / 2 = Math.Round(n / 2) Then isprimzahl = False
If n / 3 = Math.Round(n / 3) Then isprimzahl = False
If n / 5 = Math.Round(n / 5) Then isprimzahl = False
If n / 7 = Math.Round(n / 7) Then isprimzahl = False
If n = 3 Then isprimzahl = True
If n = 5 Then isprimzahl = True
If n = 7 Then isprimzahl = True
If isprimzahl Then
geändert = True
Primzahl = n
strPrimzahlen &= n & vbCrLf
bg.ReportProgress(1)
Threading.Thread.Sleep(1)
End If
Next n
End If

End Sub
Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
bg.CancelAsync()
End Sub
Private Sub bg_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bg.ProgressChanged
If geändert Then
prbState.Style = ProgressBarStyle.Marquee
prbState.Value = e.ProgressPercentage
lstPrimzahlen.Items.Add(Primzahl)
lblprimzahlencount.Text = lstPrimzahlen.Items.Count
geändert = False
End If
End Sub
Private Sub bg_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bg.RunWorkerCompleted
If e.Cancelled = True Then MsgBox("Abgebrochen")
prbState.Style = ProgressBarStyle.Blocks
prbState.Value = 0
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
MsgBox("Speichern: Speichert ALLE Primzahlen. Ende: Beendet.")
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
My.Computer.FileSystem.CreateDirectory("C:\Primzahlen\")
My.Computer.FileSystem.WriteAllText("C:\Primzahlen\Primzahlen.txt", strPrimzahlen, False)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
End
End Sub
End Class

Ich hoffe ich ihr könnt mir helfen.

Jöran
daHooligan
prinizipiell falscher ansatz wenn du JEDE primzahl berechnen willst...
denk dran dass deine variablen wie zum beispiel integer einen begrenzten speicher belegen und von daher nur begrenzt groß werden können...
Ansonsten erscheint mir der Code für die Primzahlberechnung viel zu kompliziert, ohne de code jetzt komplett angeschaut zu haben.

im prinzip brauchst du nur ne schleife die immer weiter hochzählt, dann in der schleife ne andere schleife die immer weiter dividiert und die aktuell berechnete zahl speichert und die primzahlen ausgibt.

sowas hier sollte reichen
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
FILE_HANDLE : File_Type
i:integer := 0;
j:integer := 1;
abort: boolean = false

Open(FILE_HANDLE, Ada.Text_IO.In_File, "prim.dat");

for i in 3..integer'max loop
  abort=false
  while(j<i AND !abort) loop
    if (i mod j = 0) then
      abort = true
    end if;
  j:= j+1;
  end loop;
  if(!abort) then 
    Put(i);
  end if;
  i:=i+2;
Put(i,FILE_HANDLE);
end loop;
Close(FILE_HANDLE);

inklusiv speichern der aktuellen zahl ohne auslesen und ohne fehlermeldungen....
Xanth
wie soll ich das denn einfügen??? als einfache form oder wie geht das?
und ich möchte auch dass der das dann auch speichert wenn ich es möchte und das der alles ausgibt.
Xanth
für welche Visual basic version ist das???
ich benutze nämlich 2008 Express Edition...
daHooligan
das is Ada...
ich hab das nur mal als beispiel gepostet dass du siehst was ich meine weil ich mit VB nix am hut hab.
speichern musst du dann noch machen, genauso das auslesen
Xanth
ich guck ma ob das mit Pascal zu programmieren geht, gibt ja kein Programm zum Programmieren mit "ada".
daHooligan
Zitat:
Original von Xanth
ich guck ma ob das mit Pascal zu programmieren geht, gibt ja kein Programm zum Programmieren mit "ada".

http://www.scintilla.org/SciTE.html
http://myada.matthias-hielscher.de/home.html
http://www.eclipseplugincentral.com/Web_...nk-cid-693.html

aber so interessant ist das "Projekt" nicht, weil du sowieso nur bis ca 3,40282·10^38 kommst und das ist bei der heutigen rel. schnell gerechnet
Xanth
kann man das nicht so umschreiben, dass das bis Unendlich geht?
bluescreen
in vb gibts doch jeden scheiß...
probiers ma mit
code:
1:
2:
3:
MyFrame.erechne.Primzahl.BisUnendlich()
daHooligan
Zitat:
Original von Xanth
kann man das nicht so umschreiben, dass das bis Unendlich geht?

nein
schon allein weil dein speicher nur endlich groß ist...
beschäftige dich mal damit, wie dein Computer zahlen speichert und rechnet, dann wird dir klar werden dass das nicht bis unendlich geht
Xanth
Hey bluescreen,
wie soll das gehen???
Sach ma was man da machen muss.
daHooligan
er meint damit, dass es in VB verglichen mit anderen Sprachen extrem viele Funktionen gibt und ass es von daher sicherlich auch ne Funktion gibt, die das macht was du vor hast...
Xanth
ah, also bedeutet das soviel wie, mir kann niemand helfen, oder?
daHooligan
Zitat:
Original von Xanth
ah, also bedeutet das soviel wie, mir kann niemand helfen, oder?

na ja...
das berechnen der primzahlen bis unendlich ist schlicht nicht möglich. ohne tiefergehende kenntnisse wirst du an der grenze von integer vermutlich scheitern.
wenn das dein einziges problem war kann dir damit wohl niemand helfen.
wenn dein programm dessen source du oben gepostet hast noch andere probleme hat können wir dir gerne helfen wenn du uns sagst wo genau das problem liegt (außer dass es nicht bis unendlich rechnet).
das rechnen mit sehr großen zahlen ist mit normalen mitteln zumindest nicht ohne weiteres möglich
bluescreen
also jetz ma ohne scheiß...
du kannst das schon machen, aber es macht einfach keinen sinn, da
1.jeder datentyp hat eine maximale größe->ab bsp. 14892590219 gehts nimma weiter...

2. selbest wenn mann dieses problem nicht hätte(oder umgehen würde) wär irgenwann dan arbeitspeicher voll und es ging nichtzmehr weiter. deshalb werden für die berechnung von primzahlen selhr leistungsstarke rechner eingesetzt
Xanth
Das Problem mit dem Arbeitsspeicher lässt sich beheben, denn man kann den Arbeitsspeicher löschen, aber vorher alles in ne Datei schreiben, dann die letzte bearbeitete Zahle wieder aufrufen und ab da dann weiter machen.

@daHooligan: das ist net meiner, das isn Code von nem Freund, und der sagt das der Algo fehler hat... Frag mich nicht warum^^
daHooligan
Zitat:
Original von Xanth
Das Problem mit dem Arbeitsspeicher lässt sich beheben, denn man kann den Arbeitsspeicher löschen, aber vorher alles in ne Datei schreiben, dann die letzte bearbeitete Zahle wieder aufrufen und ab da dann weiter machen.


aber irgendwann ist die zahl einfach zu groß um in deinen arbeitsspeicher geschrieben zu werden....