mehrdeutiger Aufruf einer überladener Funktion
-
Zeig bitte deinen richtigen Code. Dein Codebeispiel kann unmöglich compilieren. Bitte nur Copy & Paste benutzen. Siehe dazu den dritten Link in meiner Signatur. Sonst verschwendest du nur unsere und deine Zeit mit Fehlern, die gar keine sind, sondern beim Abschreiben entstanden sind.
-
ray91 schrieb:
Ich würde das gerne mit dem iMax machen
Das erspart viel Rechenarbeit bei großen Primzahlen.Nein, tut es nicht. Compiler optimieren, weißt du. (Ich hoffe,
nist bei dirconst)
Und meine Version sagt für 121, Keine Primzahl!
-
Sone schrieb:
ray91 schrieb:
Ich würde das gerne mit dem iMax machen
Das erspart viel Rechenarbeit bei großen Primzahlen.Nein, tut es nicht. Compiler optimieren, weißt du. (Ich hoffe,
nist bei dirconst)Wieder Unsinn. Kein Compiler der Welt optimiert dir eine Schleife bis n/2 zu sqrt(n), weil er erkennt, dass die Bedingung nie wieder wahr wird. Mit diesem Argument könnte der Compiler anstatt die Schleife zu erzeugen auch erkennen, dass hier Primzahlen gesucht werden und stattdessen einen effizienten Algorithmus generieren. Hör gefälligst auf, zu jedem Thread Müll zu labern! Ich war die letzten 15 Minuten beschäftigt nur deinen Schrott zu korrigieren!
-
SeppJ schrieb:
Sone schrieb:
ray91 schrieb:
Ich würde das gerne mit dem iMax machen
Das erspart viel Rechenarbeit bei großen Primzahlen.Nein, tut es nicht. Compiler optimieren, weißt du. (Ich hoffe,
nist bei dirconst)Wieder Unsinn. Kein Compiler der Welt optimiert dir eine Schleife bis n/2 zu sqrt(n), weil er erkennt, dass die Bedingung nie wieder wahr wird.
Bist du doof oder so?
Ich meinte, dass man nicht den Endindex in eine Variable auslagern muss!! Lies doch!
-
Also ich hoffe mal es ist okay, dass ich jetzt den ganzen Code poste:
#include "stdafx.h" #include <iostream> using namespace std; int main(int n) { cout << "Geben Sie eine Zahl ein:\n"; cin >> n; if (n<2) { cout << "Keine Primzahl\n"; system("pause"); return 0; } if (n==3) { cout << "Primzahl\n"; system("pause"); return 0; } if (n % 2 == 0) { cout << "Keine Primzahl\n"; system("pause"); return 0; } const unsigned int iMax = sqrt(n) + 1; for (unsigned int i = 3; i <= iMax, i+=2) if (n % i == 0) { cout << "Keine "; break; } cout << "Primzahl!"; system("pause"); return 0; }Da kommt eine Fehlermeldung, diese verschwindet aber sofort, sodass ich sie gar nicht erkennen kann. Wie gesagt, ich bin der Meinung, dass sich irgendwo ein kleiner blöder Programmierfehler eingeschlichen hat. Bin noch nicht lange dabei.
Schonmal vielen Dank
-
int main(int n)Das geht nicht. Wenn du wissen willst, was main für Parameter haben kann, googel das mal.
Ansonsten wird er dir noch sagen, dass sqrt nicht deklariert ist, das ist es nämlich in der Headerdatei cmath.
Außerdem hast du das ganz schön umständlich gelöst.
Deine Schleife kannst du auch gleich ganz leicht in eine hübsche Funktion packen.
Könnte so aussehn.#include <iostream> #include <cmath> using namespace std; bool ist_primzahl(int zahl) { if(zahl < 2) return false; if(zahl == 2) return true; for(int i = 2; i <= (zahl / 2); ++i) if(zahl % i == 0) return false; return true; } int main() { int n; cout << "Geben Sie eine Zahl ein:\n"; cin >> n; if(ist_primzahl(n)) std::cout << "Primzahl!\n"; else std::cout << "Keine Primzahl!\n"; return 0; }
-
Wenn ich das Programm so kopiere sagt es mir 121 ist prim
Irgendwas stimmt doch hier mit meinem Programm nicht.
Und anstatt bis n/2 reicht es ja bis sqrt(n)+1 zu gehen.Wieso klappt das bei mir nicht?
-
Du musst schon den Quellcode zeigen, der nicht funktioniert...
-
So siehts jetzt aus:
Ich habe den Verdacht, dass lediglich auf modulo 2 und 3 getestet wird. Zahlen wie 25,121 sind prim, Zahlen die gerade oder durch 3 teilbar sind werden als nicht prim ausgegeben.#include <iostream> #include <cmath> using namespace std; bool ist_primzahl(int zahl) { if(zahl < 2) { return false } if (zahl==3) { return true } if(zahl % 2 ==0) { return false } for(unsigned int i=3,i<=(sqrt(zahl)+1),i+=2) { if(zahl % i ==0) { return false } } return true; } int main() { int n; cout << "Geben Sie eine Zahl ein:\n"; cin >> n; if(ist_primzahl(n)) cout << "Primzahl!\n"; else cout << "Keine Primzahl!\n"; return 0; }
-
ray91 schrieb:
So siehts jetzt aus:
Da schon mehr als einmal auf C&P hingewiesen wurde, gehe ich mal davon aus, dass das ein Trollversuch sein soll.
-
Der Code steht doch da
-
Mein "fertiges" Programm sieht jetzt so aus: (Es ist C&P)
#include "StdAfx.h" #include <iostream> #include <cmath> using namespace std; bool IstPrimzahl(int zahl) { int i; if(zahl<2) return false; if(zahl==3) return true; for(i=3; i<=sqrt(static_cast<double>(zahl)); i+=2) { if ( zahl % i == 0 ) { return false; } } return true; } int main() { int n; cout << "Geben Sie eine Zahl ein:\n"; cin >> n; if(IstPrimzahl(n)) cout << "Primzahl!\n"; else cout << "Keine Primzahl!\n"; system("Pause"); return 0; }Für kleine Zahlen macht es alles richtig.
Wenn ich aber jetzt größere Zahlen benutze, wie zum Beispiel 2^4423-1, sagt mir das Programm immer "keine Primzahl", was wohl an der Größe der Zahl liegt. Welche Library brauche ich denn jetzt für solche großen Zahlen?
Habe mit google nichts gefunden.
Links in anderen Foren sind meistens auf Seiten verlinkt, die nicht mehr existieren..
-
GNU MP, zum Bleistift.
-
2^4423 kannst du mit deinem Algorithmus sowieso vergessen. Da würden alle Computer der Welt zusammen, selbst die, die noch in Zukunft gebaut werden, so lange dran Rechnen, dass man da tatsächlich mal das Wort "ewig" benutzen darf.
Auch wird dir GNU MP da herzlich wenig nutzen. Wieder: Alle Computer der Welt, selbst die, die noch nicht gebaut wurden, zusammen, können diese Zahl nicht genau speichern.Du brauchst einen Primzahltest wie z.B. Miller-Rabin.
-
SeppJ schrieb:
2^4423
[...]
Alle Computer der Welt, selbst die, die noch nicht gebaut wurden, zusammen, können diese Zahl nicht genau speichern.Ich glaube, mein Computer verfügt über mehr als 4423 bit Speicherkapazität...
-
Im Endeffekt läuft das ganze auf den AKS Primzahltest hinaus, aber dort brauch ich auch eine Library für große Zahlen. Diese Zahl habe ich nur mal eingesetzt um zu schauen was passiert, aber es funktionierte ja leider nicht, da mir die library fehlte.
Danke für die Antwort
-
camper schrieb:
Ich glaube, mein Computer verfügt über mehr als 4423 bit Speicherkapazität...
Ups, ja. Ein bisschen verschätzt.

-
SeppJ schrieb:
Ups, ja. Ein bisschen verschätzt.

Nur ganz leicht. Nicht jeder Computer hat so enorm viel Speicher

-
SeppJ schrieb:
Auch wird dir GNU MP da herzlich wenig nutzen.
... 