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:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 205149
Url: https://administrator.de/contentid/205149
Ausgedruckt am: 26.11.2024 um 09:11 Uhr
19 Kommentare
Neuester Kommentar
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
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
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.
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.
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 =)
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???
Doch
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 ...
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
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 0
Hey @Noobstar0815,
warum macht man sich eigentlich die Mühe, Anleitungen zu schreiben?
Rechnen in Batch
Gruß
Snow
warum macht man sich eigentlich die Mühe, Anleitungen zu schreiben?
Rechnen in Batch
Gruß
Snow
Spontan verweise ich da mal auf http://www.mathematik.de/ger/fragenantworten/erstehilfe/primfaktorzerle ... da kannst Du das mit der Quad.-Wuzel mal nachlesen.
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
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
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
Und wie in der vorherigen Antwort schon erwähnt... je grösser die Zahl umso länger rechnet er...
Gruss Apop
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 könnte man aber theoretisch noch machen mitText gelesen? Der gr. PF kann nicht größer als die QWurzel sein - das versuche ich Dir nahe zu bringen.
set /a QWT=%counter%*%counter%
if %QWT% geq %eingabe% set "ausgabe=Ist eine Primzahl!" & goto Done
Gruss Apop
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
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...
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...