noobstar0815
Goto Top

Taschenrechner mit Batch-Programm

Hallo =)
Ich habe grade etwas Freizeit auf der Arbeit und da kam mir die Idee: Warum nicht einen Rechner bauen, der mir Primzahlen ausrechnet? Leider stoße ich sehr früh schon auf ein Problem

Ich habe leider keine Ahnung wie man mit Batch rechnen muss. Gedacht habe ich es mir so:
Ich gebe eine Zahl ein, zum Beispiel 100. Dann soll die Datei nacheinander erst durch 99, dann durch 98 etc rechnen. Das könnte man noch ungefähr so lösen:
set zahl1=100
set zahl2=%zahl1% (oder nicht?)

:rechnen

set zahl2=%zahl2%-1 (Geht dies oder wie kann ich es sonst lösen, dass zahl2 jedesmal um 1 kleiner wird?)

set /a %zahl1%/%zahl2%

if %zahl2%==0 goto END

goto RECHNEN

:end
pause

Soweit das halbwegs einfache. Wo ich Probleme mit habe ist folgendes: Wie schaffe ich es, dass mir das Batch-Programm alle Nachkommastellen anzeigt, oder mindestens 20? Wie schaffe ich es, dass das Programm automatisch aufhört, sobald es keine Nachkommastellen gibt (es also keine Primzahl ist)?
Ich denke da wird es noch mehr Probleme geben, die mir grade nicht einfallen hehe.
Wisst ihr da weiter, oder ratet ihr mir besser komplett davon ab?
MfG Noobstar0815

Content-ID: 205149

Url: https://administrator.de/contentid/205149

Ausgedruckt am: 26.11.2024 um 09:11 Uhr

MrNetman
MrNetman 17.04.2013 um 14:07:17 Uhr
Goto Top
Villeicht solltest du rechts oben mal suchen, wie andere das machen:
http://it074.de/wiki/Primzahlen%28Batch%29
und etwas Theorie:
http://www.mathe.tu-freiberg.de/~hebisch/cafe/primzahlen.html

Du hast ja noch gar nicht wirklich angefangen ...

Gruß
Netman
SarekHL
SarekHL 17.04.2013 aktualisiert um 14:14:14 Uhr
Goto Top
Zitat von @Noobstar0815:
Ich habe leider keine Ahnung wie man mit Batch rechnen muss.

Ich auch nicht ... so etwas würde ich immer mit VB bzw. VBS machen.

Aber laß mich eine Anmerkungen zu Deinem Lösungsweg machen:

Gedacht habe ich es mir so:
Ich gebe eine Zahl ein, zum Beispiel 100. Dann soll die Datei nacheinander erst durch 99, dann durch 98 etc rechnen.

Damit verschwendest Du bei der Primzahlensuche wertvolle Rechenzeit. Wenn Deine Zahl z.B. 117 ist, brauchst Du nicht alle Zahlen von 2 bis 116 als Divisor nehmen, sondern lediglich bis zu 117/2 -> 58,5 -> abgerundet 58. Denn alle Zahlen darüber sind uninteressant!

Außerdem kannst Du auch alle geraden Zahlen ab 4 weglassen, denn wenn irgendeine Zahl davon als Divisor in Frage käme, hätte es auch schon mit der 2 geklappt.
Noobstar0815
Noobstar0815 17.04.2013 aktualisiert um 14:19:15 Uhr
Goto Top
Zitat von @SarekHL:
> Zitat von @Noobstar0815:
> ----
> Ich habe leider keine Ahnung wie man mit Batch rechnen muss.

Ich auch nicht ... so etwas würde ich immer mit VB bzw. VBS machen.

Aber laß mich eine Anmerkungen zu Deinem Lösungsweg machen:

> Gedacht habe ich es mir so:
> Ich gebe eine Zahl ein, zum Beispiel 100. Dann soll die Datei nacheinander erst durch 99, dann durch 98 etc rechnen.

Damit verschwendest Du bei der Primzahlensuche wertvolle Rechenzeit. Wenn Deine Zahl z.B. 117 ist, brauchst Du nicht alle Zahlen
von 2 bis 116 als Divisor nehmen, sondern lediglich bis zu 117/2 -> 58,5 -> abgerundet 58. Denn alle Zahlen darüber
sind uninteressant!

Außerdem kannst Du auch alle geraden Zahlen ab 4 weglassen, denn wenn irgendeine Zahl davon als Divisor in Frage käme,
hätte es auch schon mit der 2 geklappt.

Hallo SarkHL, mit dem alles über 58 ist unintressant hast du recht, allerdings liegst du mit dem alle graden Zahlen ab 4 falsch. Schauen wir uns 115 an, ist nicht durch 2 oder 4 teilbar, allerdings durch 5 und dadurch keine Primzahl mehr =)

Naja, aufgrund eines Denkfehlers meinerseits lasse ich die Idee mit dem Rechner lieber sein, trotzdem danke euch =)

EDIT: Ich wollte eigentlich neue Primzahlen ausrechnen (ja ich weiß dass sie elendig lang sind), dabei habe ich vergessen das CMD ja nur mit 31-bit-Zahlen rechnen kann hehe
SarekHL
SarekHL 17.04.2013 um 14:25:07 Uhr
Goto Top
Zitat von @Noobstar0815:
Hallo SarkHL, mit dem alles über 58 ist unintressant hast du recht, allerdings liegst du mit dem alle graden Zahlen ab 4 falsch. Schauen wir uns 115 an, ist nicht durch 2 oder 4 teilbar, allerdings durch 5 und dadurch keine Primzahl mehr =)

Und seit wann ist die 5 eine gerade Zahl???
Noobstar0815
Noobstar0815 17.04.2013 um 14:29:24 Uhr
Goto Top
Ich sprach nie von geraden Zahlen.
Zur Erläuterung, eine Primzahl ist nur durch 1 und sich selbst teilbar. Ob eine Zahl nun gerade oder ungerade ist, ist egal. Solltest du eine Zahl durch eine andere Zahl teilen, und es kommt eine GANZE Zahl raus, weißt du, dass Zahl1 keine Primzahl ist.
SarekHL
SarekHL 17.04.2013 aktualisiert um 14:35:27 Uhr
Goto Top
Zitat von @Noobstar0815:
Ich sprach nie von geraden Zahlen.

Doch face-smile

Du sagtest, daß ich mit meiner Aussage, daß alle geraden Zahlen ab 4 als Divisor uninteressant sind, falsch läge. Und dann hast du als Beispiel die Dividierbarkeit der 115 durch 5 angeführt. Lies noch mal, was Du geschrieben hast ...
Noobstar0815
Noobstar0815 17.04.2013 um 14:38:50 Uhr
Goto Top
Meh... :D
Also:
RICHTIGSTELLUNG
Du hast recht, die einzige GERADE Zahl mit der man rechnen muss ist 2, allerdings darf man die ungeraden nicht vergessen.
So richtig? :D

PS: Ich kann mich grade nicht mehr so gut konzentrieren, sitze schon 6 Stunden vorm PC
Noobstar0815
Noobstar0815 17.04.2013 um 14:40:09 Uhr
Goto Top
Achso, weitergehen brauch man generell nicht versuchen eine Zahl zu prüfen, ob es eine Primzahl ist, wenn die letzte Ziffer gerade ist... :D
SarekHL
SarekHL 17.04.2013 aktualisiert um 14:46:29 Uhr
Goto Top
Zitat von @Noobstar0815:
Achso, weitergehen brauch man generell nicht versuchen eine Zahl zu prüfen, ob es eine Primzahl ist, wenn die letzte Ziffer gerade ist... :D

Richtig .. Darum habe ich als Beispiel ja auch die 117 genommen und nicht wie Du ursprünglich die 100 0face-smile
Snowman25
Snowman25 17.04.2013 um 16:00:35 Uhr
Goto Top
Hey @Noobstar0815,

warum macht man sich eigentlich die Mühe, Anleitungen zu schreiben?
Rechnen in Batch

Gruß
Snow
DerWoWusste
DerWoWusste 17.04.2013 aktualisiert um 21:22:12 Uhr
Goto Top
mit dem alles über 58 ist unintressant hast du recht
Nö, nicht wirklich. Der größte Primfaktor irgendeiner zusammengesetzten Zahl kann Ihre Quadratwurzel sein, nicht ihre Hälfte.
Noobstar0815
Noobstar0815 18.04.2013 um 09:33:47 Uhr
Goto Top
Snowman, hatte über Google leider nichts gefunden, tut mir leid.

DerWoWusste, spontan macht das für mich gar keinen Sinn. Weil demnach müsste es eine ganz Zahl geben, die geringer als 2 aber größer als 1 ist. Weil durch 1 ist jede ganze Zahl teilbar und durch 2 wären wir schon wieder bei dem Thema mit alles was größer als die Hälfte ist, ist unintressant.
DerWoWusste
DerWoWusste 18.04.2013 um 09:45:51 Uhr
Goto Top
Spontan verweise ich da mal auf http://www.mathematik.de/ger/fragenantworten/erstehilfe/primfaktorzerle ... da kannst Du das mit der Quad.-Wuzel mal nachlesen.
Noobstar0815
Noobstar0815 18.04.2013 um 09:55:51 Uhr
Goto Top
Ok, zum klarstellen : Der größte Primfaktor kann nicht größer als die Hälfte sein. Es kann genau so groß sein wie die Hälfte, aber nicht größer.
DerWoWusste
DerWoWusste 18.04.2013 um 10:04:04 Uhr
Goto Top
Text gelesen? Der gr. PF kann nicht größer als die QWurzel sein - das versuche ich Dir nahe zu bringen.
Apop85
Apop85 19.04.2013, aktualisiert am 20.04.2013 um 03:15:09 Uhr
Goto Top
Hallo @Noobstar0815

Hatte vor kurzem die selbe Idee und hab dazu eine Anleitung geschrieben:
Berechnen auf nahezu beliebige Kommastellen nur mit Batch (30000 Stellen getestet)

Zwar nicht direkt das selbe aber theoretisch könntest du einen counter einbauen der von x : 1 anfängt und bei x : 100 aufhört
Dann müsstest du dazu noch die Ausgabe prüfen ob diese aus Nullen beseteht. z.B. das es nach drei Nullen hintereinander sagt die Zahl ist (sofern nicht 1 oder die eingegebene Zahl) keine Primzahl... Nachteil bei dieser Methode ist, dass wenn grössere Zahlen angegeben werden diese wohl etwas länger gehen zum berechnen.

Viel Spass

Lg Apop
Apop85
Apop85 20.04.2013, aktualisiert am 21.04.2013 um 03:00:00 Uhr
Goto Top
Hier dein Primzahlenrechner... Sogar mit "Luxus" Ladebalken und Fortschrittanzeige ;) Jedoch besitzt er einen Fehler... wenn das Resultat eingabe : counter z.b. 1.000012 ergibt (z.B. bei 31333) erhält er nur 1.0000 und denkt dass dies keine Primzahl ist... er funktioniert (Durch einschränkungen des CMD) in dieser Ausführung bis +/- 213999 (Bis dahin hat er mir noch richtig gerechtnet). Hab aber noch eine Abfrage gemacht ob er die Zahl überhaubt rechnen kann (Zeile 24)

Ich berechne hier bis zur hälfte der eingegebenen Zahl... danach kommt ja eh nur noch 0.irgendwas raus und wenn er schon soweit gerechnet hat weiss er ja dass es eine Primzahl ist

Versehentlich den falschen Beitrag editiert :( 
und hab das alte Beispiel nicht mehr aber optimierte 
Verision die die Rechnung auf 30 Kommastellen prüft 
steht unten bei meinem nächsten Beitrag.

Und wie in der vorherigen Antwort schon erwähnt... je grösser die Zahl umso länger rechnet er...

Zitat von @DerWoWusste:
Text gelesen? Der gr. PF kann nicht größer als die QWurzel sein - das versuche ich Dir nahe zu bringen.
Das hab ich hier jetzt noch nicht umgesetzt face-smile könnte man aber theoretisch noch machen mit

set /a QWT=%counter%*%counter%
if %QWT% geq %eingabe% set "ausgabe=Ist eine Primzahl!" & goto Done  

Gruss Apop
MrNetman
MrNetman 20.04.2013 um 10:08:13 Uhr
Goto Top
Super ...
macht Spaß

Gruß
Netman
Apop85
Apop85 21.04.2013 aktualisiert um 15:46:54 Uhr
Goto Top
So und noch abschliessend... Nochmals der selbe Rechner nur dass er jetzt das Resultat erst auf 30 Kommastellen überprüft bevor er sagt dass es keine Primzahl ist.

Ich denke das sollte doch ausreichen um den Thread als gelöst zu markieren? ;) (Kann noch beliebig ausgeweitet werden denke ich, Jedenfalls kann die Kommastelle auf die Maximale Länge einer Variable überprüft werden... k.A. wie viele Zeichen DOS vergleichen kann...)

EDIT: habs zuerst falsch interpretiert, habs aber Korrigiert. Zahlen bis 999'999 rechnet er noch richtig danach ist Sense warum weiss ich nicht... eigentlich müsste es bis 20'000'000 gehen da Dos ja Summen bis 2Mrd berechnen sollte... K.A. warum das so ist

@echo off & setlocal 
TITLE Primzahlenpruefer

:RESET
echo Gib hier deine Zahl ein (Max.:999'999):  
set /p eingabe=
set counter=0
set "a=..." & set "b=..."  
set "c=..." & set "d=..."  
set "e=..." & set "f=..."  
set "g=..." & set "h=..."  
set "i=..." & set "j=..."  
set eingabetmp=%eingabe%
set /a ziel=%eingabe%/2
set /a ziel+=1
if %eingabe% geq 1000000 ( set "ausgabe=ist zum berechnen zu gross!" & goto Done )  
set counterz=0
goto Ziel

:Berechnung
set /a operator=%eingabe%*100
set /a counter+=1
set calctimer=0
set /a div0=%operator%/%counter%
set /a div1=%div0%/100
set "div2=%div0:~-2%  
set /a prozent=%counter%*100
set /a prozent=%prozent%/%ziel%
set "ausgabe2=" & set "divb="  
set "ausgabe2=" & set "check="  
cls
echo.
echo            Primzahl Ja oder Nein?
echo --------------------------------------------------
echo Berechnung: %eingabe% : %counter% = %div1%.%div2%
echo --------------------------------------------------
echo Ziel      : %eingabe% : %ziel% =
echo --------------------------------------------------
echo --------------------------------------------------
echo        Berechnung abgeschlossen: 
echo !!%a%%b%%c%%d%%e%%f%%g%%h%%i%%j%!!
echo             %prozent% Prozent
echo --------------------------------------------------
if "%counter%" neq "1" ( if "%counter%" neq "%ziel%" ( if "%div2%" == "00" ( goto CALCULATE ) ) )  
if "%counter%" == "%ziel%" set "ausgabe=ist eine Primzahl!" & goto Done  
if %prozent% geq 10 set "a=III"  
if %prozent% geq 20 set "b=III"  
if %prozent% geq 30 set "c=III"  
if %prozent% geq 40 set "d=III"  
if %prozent% geq 50 set "e=III"  
if %prozent% geq 60 set "f=III"  
if %prozent% geq 70 set "g=III"  
if %prozent% geq 80 set "h=III"  
if %prozent% geq 90 set "i=III"  
if %prozent% geq 98 set "j=III"  
goto Berechnung

:Done
cls
echo.
echo            Primzahl Ja oder Nein?
echo --------------------------------------------------
echo Berechnung: %eingabe% : %counter% = %div1%.%div2%
echo --------------------------------------------------
echo Die Zahl %eingabe% %ausgabe%
echo --------------------------------------------------
echo Um den dividend %counter% zu uebergehen j eingeben.
set /p next=
if "%next%" == "j" goto Berechnung  
goto RESET

:CALCULATE
cls
set /a calctimer+=1
echo            Primzahl Ja oder Nein?
echo --------------------------------------------------
echo Berechnung: %eingabe% : %counter% = %div1%.%check%
echo --------------------------------------------------
echo Ziel      : %eingabe% : %ziel% =
echo --------------------------------------------------
echo --------------------------------------------------
echo        Berechnung abgeschlossen: 
echo !!%a%%b%%c%%d%%e%%f%%g%%h%%i%%j%!!
echo             %prozent% Prozent
echo --------------------------------------------------
set /a diva=%eingabetmp%/%counter%
if "%diva%" == "0" ( set "ausgabe2=0" & set "divb=0" )  
if "%diva%" neq "0" ( set "ausgabe2=%diva%" & set /a divb=%diva%*%counter% )  
if %diva% GEQ 1 ( set /a eingabetmp=%eingabetmp%-%divb% )
set /a eingabetmp=%eingabetmp%*10
if "%calctimer%" == "1" goto CALCULATE  
if defined check set "check=%check%%ausgabe2%"   
if not defined check set "check=%ausgabe2%"  
if "%check%" == "000000000000000000000000000000" set "ausgabe=Ist keine Primzahl sie ist durch %counter% Teilbar" & goto Done  
if "%calctimer%" == "31" goto Berechnung    
goto CALCULATE

:Ziel
cls
echo.
echo Zielwert wird berechnet! Einen Augenblick bitte!
set /a counterz+=1
set /a QWT=%counterz%*%counterz% 
echo           %counterz%*%counterz% = %QWT%
if %QWT% geq %eingabe% set /a ziel=%counterz% & goto Berechnung
goto Ziel

P.S
wenn man den Startwert vertauscht mit dem Zielwert bei ":Ziel" berechnet er nur ab der Zahl die zum Quadrat grösser oder gleich der Eingabe ist... somit können auch etwas grössere Zahlen berechnet werden... Ich hab jetzt auch die Multiplikation heruntergestellt auf 100 da die Berechnung so oder so auf 30 Kommastellen stattfindet... Tiefer als 100 würde ich jedoch nicht gehen da man ja Kommastellen zum prüfen braucht. So bleiben ihm doch noch zwei... alles was mit ,00 endet überprüft er bis zur 30. Kommastelle...