Primzahlenprogramm

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

RPG-Fan

Betreff: Primzahlenprogramm

BeitragSo, Jun 19, 2005 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoffe ich bin hier richtig, sorry, aber ich finde mich hier noch nicht so zurecht.Embarassed
Ich habe schon in verschiedenen Programmiersprachen programmiert, ich wollte ein Primzahlen Programm von der Programmiersprache C in Blitz Basic recoden.
Aber irgendwas mache ich falsch.
Ich bin mir nicht sicher, ob es den Befehl Rest errechnen gibt.
Falls nicht, kann man den irgendwie in einer Function schreiben?
Ansonsten habe ich noch einen mir klaren Fehler, nämlich expecting end of line.
Hier mal der Quellcode:
Code: [AUSKLAPPEN]
zahl=0
Color(0,255,0)
Text("PZP by RPG-Fan")
zahl=Input("Zahl eingeben!")
If zahl%2>0 And zahl%3>0 And zahl%5>0 And zahl%7>0 And zahl%11>0 And zahl%13>0 And zahl%17>0 And zahl<>0 Then
Text("Ihre Zahl ist eine Primzahl!")
EndIf
If zahl=0 Then
Text("Durch Null geht jede Zahl!")
EndIf
If zahl=1 Then
Text("Die Zahl 1 hat nichts mit Primzahlen zu tun!")
EndIf
If zahl=2 Or zahl=3 Or zahl=5 Or zahl=7 Or zahl=11 Or zahl=13 Or zahl=17 Then
Text("Ihre Zahl ist eine Primzahl!")
Else
Text("Ihre Zahl ist keine Primzahl!")
WaitKey(*)
End

Vom zahl% nach If bis zu then habe ich den Fehler.
Wenn ich die Zeile dort umbreche, gibt es gleich wieder einen Fehler:
Expecting endif.
Habe ich natürlich nicht vergessen, würde sich vielleicht beheben lassen,
aber ich hätte nicht den Effekt, den ich haben wollte.

Bitte helft mir! Confused

simi

BeitragSo, Jun 19, 2005 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Für den Rest zu errechnen kannst du modulo (ql:mod) nehmen....

Was ich an deinem Code nicht verstehe, was du mit dem "%n" erreichen willst.... Willst du damit den Rest ausrechnen?? - Dann wäre das aber keine Promzahl.....

Ansonsten, das "Expecting ...." kommt davon, dass du endif vergessen hast..... Auch Waitkey hast du noch ein bisschen falsch angewendet..... Wink

Was nicht schlecht wäre, wenn du den Code noch ein bisschen einrücken würdest....

Zitat:

zahl=0
Color(0,255,0)
Text("PZP by RPG-Fan")
zahl=Input("Zahl eingeben!")

If zahl%2>0 And zahl%3>0 And zahl%5>0 And zahl%7>0 And zahl%11>0 And zahl%13>0 And zahl%17>0 And zahl<>0 Then
Text("Ihre Zahl ist eine Primzahl!")
EndIf

If zahl=0 Then
Text("Durch Null geht jede Zahl!")
EndIf

If zahl=1 Then
Text("Die Zahl 1 hat nichts mit Primzahlen zu tun!")
EndIf

If zahl=2 Or zahl=3 Or zahl=5 Or zahl=7 Or zahl=11 Or zahl=13 Or zahl=17 Then
Text("Ihre Zahl ist eine Primzahl!")
Else
Text("Ihre Zahl ist keine Primzahl!")
endif
WaitKey()
End
 

RPG-Fan

BeitragSo, Jun 19, 2005 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, mit ein paar weiteren Änderungen geht das Programm! Very Happy
War auch noch ein Denkfehler enthalten!
Danke für die Hilfe!Wink

D2006

Administrator

BeitragSo, Jun 19, 2005 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.


MfG
D2006

Triton

BeitragSo, Jun 19, 2005 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Arrow https://www.blitzforum.de/viewtopic.php?t=11977
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Jack

BeitragMo, Jun 20, 2005 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, willkommen im Forum Exclamation
 

ChristianH

BeitragMo, Jun 20, 2005 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich verwende diese mathematisch anerkannte Methode. Wink

Code: [AUSKLAPPEN]
Print prime(7)
WaitKey

Function prime(number%)
   result = True
   
   For i = 2 to sqr(number%)
      if number mod i = 0 then result = False
   Next
   
   Return result
End Function


Die von Triton hat irgendwie zu viel überflüssigen Code in der Primzahlen Funktion.

Schneller sollte es nur mit einer schnelleren Sprache oder mit Assembler gehen... Wink

MfG

Hip Teen

BeitragMo, Jun 20, 2005 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
deiner geht auch noch kürzer ganxta
BlitzBasic: [AUSKLAPPEN]
Print prime(7)
WaitKey

Function prime(number%)

For i = 2 To Sqr(number%)
If number Mod i = 0 Then Return False
Next

Return True
End Function

arbeitet auch schneller Wink je nach Fall...
Tritons ist deswegen länger, weil er noch ein paar Spezialfälle ausschließt. Wenn man nen anderen Algorithmus nimmt, geht es schneller. Jedenfalls für ganz große Zahlen oder wenn man eine große Zahl (wie in Tritons Fall) an Primzahlen berechnet. Man erstellt einfach eine Liste von allen Zahlen von 2 bis zu der Hälfte der Höchsten (oder von der einen Zahl, wenn man das ganze nur bei einer ausrechnet). Nun entfernt man die Zahlen, die das vielfache eines verwendeten Teilers sind.

Spart bei großen Zahlen(mengen) enorm Zeit
  • Zuletzt bearbeitet von Hip Teen am Mo, Jun 20, 2005 19:56, insgesamt einmal bearbeitet

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Jun 20, 2005 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Nun entfernt die Zahlen, die das vielfache eines verwendeten Teilers sind.

also nur die Primzahlen...
[BB2D | BB3D | BB+]

Hip Teen

BeitragMo, Jun 20, 2005 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ups, mir fällt grad auf, das war ein denkfehler, das ganze wie ich es beschrieben habe gilt nur bei einer Zahl, die man ausrechnet. Da wird also eine Liste erstellt, mit allen Teilern und immer das vielfache, eines Teilers entfernt. Wenn man also durch 5 geteilt hat, werden 10, 15, 20 usw. entfernt. Wenn man nämlich eine Zahl durch 20 teilen kann, kann man sie genauso durch 5 teilen (5. Klasse Mathematik Wink ).

Bei einer Zahlenmenge erstellt man eine List der Potenziellen Zahlen. Wenn man 5 geprüft hat (egal ob es eine Primzahl ist oder nicht) entefernt man die vielfachen von 5. Also 5,10,15,20. Denn die kann man ja alle durch 5 teilen Wink.

So, hoffe mal jetzt ist kein Denkfehler mehr drinnen.

Edit: Obwohl, man kann eigentlich bei der Zahlenmenge eigentlich auch das anwenden, was ich für eine einzelne Zahl beschrieben hab. Da ist es am geschicktesten, das am anfang zu rechnen, und zwar für die größte Zahl, dann hat man ne wesentlich kleinere Anzahl an Teilern, die man prüfen muss

SpionAtom

BeitragDi, Jun 21, 2005 9:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab da einen Fehler gemacht Embarassed
Sorry
  • Zuletzt bearbeitet von SpionAtom am Di, Jun 21, 2005 17:24, insgesamt einmal bearbeitet
 

Apocalyptic

BeitragDi, Jun 21, 2005 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
@ SpionAtom: Falsch Wink

Dein Code überprüft nur, ob eine Zahl durch zwei teilbar ist.
Suum cuique

[ www.ffs-net.de.vu ] [ Raycaster ]

Ctuchik

BeitragDi, Jun 21, 2005 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch eine kleine Optimierung: Gerade Zahlen gleich ausschließen, dann kann man in Zweierschritten vorgehen!
EDIT: Und ich glaube es bringt auch noch Geschwindigkeit wenn man die Wurzel in einer Variable zwischenspeichert, sonst rechnet er sie bei jedem Schleifendurchlauf neu aus und Sqr ist ja bekanntlich langsam!

BlitzBasic: [AUSKLAPPEN]
Print prime(7)
WaitKey

Function prime(number%)

If (number Mod 2 = 0) Then Return False
wurzel% = Floor(Sqr(number%))

For i=3 To wurzel Step 2
If (number Mod i = 0) Then Return False
Next

Return True
End Function
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!
 

dubitat

BeitragMi, Jul 20, 2005 11:48
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo,
habe eine optimierung noch vorgenommen bzw ein eigenes programm geschrieben... du brasuchst nicht in zweierschritten vorgehen sondern kannst einmal 2 dann 4 dann 2 dann 4 schritte gehen usw... das sollte das programm dann nochmal um die hälfte beschleunigen...

BlitzBasic: [AUSKLAPPEN]
fileout = WriteFile(\"primzahlen.txt\")
Type zahl
Field zahl
End Type
x=2
teiler=1
primzahl=1

While primzahl<=1000000
donix=0
teiler=1
primzahl = primzahl + x
If x=2 Then x=4
If x=4 Then x=2
i=2
For primzahlen.zahl = Each zahl
If primzahl Mod primzahlen\zahl = 0 Then
donix = donix+1
EndIf
Next
If donix = 0 Then
WriteLine fileout,primzahl
primzahlen.zahl = New zahl
primzahlen\zahl=primzahl
Print primzahl
EndIf
Wend
CloseFile fileout


habe ihn leider nicht formatiert, aber ich denke ihr findet euch trotzdem zurecht... dieses kleine programm schreibt alle primzahlen in eine datei (primzahlen.txt) und ein types field, um nachher nur zu prüfen, ob die zahl durch die schon vorhandenen primzahlen zu teilen ist, da dies die schnellste mir bekannte möglichkeit ist... so spuckt der dann alle prmzahlen bis 1 000 000 innerhalb kurzer zeit aus... allerdings wenn die zahlen viel größer werden gibt es denke ich irgendwann ziemliche rechenschwierigkeiten... hatte vorher ne einfache routine geschrieben, die einfach alle zahlen durchprobiert... bin damit nie bei 1 000 000 angekommen... so sollte es aber am schnellsten gehen... vielleicht will daran ja noch jemand was optimieren...
Erare humanum est - Irren ist Menschlich

Triton

BeitragMi, Jul 20, 2005 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie schon hier geschrieben: https://www.blitzforum.de/viewtopic.php?t=12824 ist das verdammt langsam.

etwa nur 1/2000 so schnell, wie die schnellste dort gepostete Variante:
https://www.blitzforum.de/viewtopic.php?t=11977

Smile


ganxta hat Folgendes geschrieben:
Die von Triton hat irgendwie zu viel überflüssigen Code in der Primzahlen Funktion.

Dafür ist meine Routine ungleich schneller, wenn es darum geht, viele Primzahlen zu finden.
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group