2016-08-05 17 views
-1

Ich habe versucht, dieses Programm für mehrere Stunden zu erstellen und bin zu dem Punkt gekommen, wo ich völlig ratlos bin. Ich verwende den GNU GCC Compiler in Codeblocks.Funktion zum Definieren, ob eine Zahl prim ist oder nicht C++ Programm zum Absturz bringt

#include <iostream> 

using namespace std; 

bool Is_Prime(int number); 

int main() { 
    if (Is_Prime(3)) { 
     cout << "Prime" << endl; 
    } 
    system("pause"); 
} 
bool Is_Prime(int number) { 
    int x = 0; 
    for (int i = 0; i <= number; i++) { 
     if ((number % i) == 0) { 
      x = x + 1; 
     } 
     if (x > 2) { 
      return false; 
     } 
    } 
    return true; 
} 

es ist wahrscheinlich etwas dumm, aber ich bin nur neu in die Programmierung

+7

Der Modulooperator '%' ist ein Doing a * division *, und Division mit Null ist ...? –

+0

Danke für die schnelle Antwort, ich werde schnell meine Version des Codes bearbeiten und sehen, ob es funktioniert –

+0

Es hat funktioniert: D Danke für Ihre Hilfe –

Antwort

2

TL; DR: Das Update ist Ihre Schleife von 1, nicht von 0 zu starten:

... 
for (int i = 1; i <= number; i++) { 
... 

auch Sie, müssen Sie nicht alle Nummern von 1 bis number überprüfen, um sicherzustellen, dass number Prime ist. Sobald der erste Divisor gefunden wurde, können Sie sicher sein, dass number nicht prim ist. Und wenn keine Teiler von 1 bis sqrt(number) gefunden wurden, können Sie sicher sein, dass number Prime ist. Und es gibt auch einen Spezialfall von 1.

Also, lassen Sie mich Ihren Code ein wenig verbessern:

bool Is_Prime(int number) 
{ 
    for (int i = 2; i * i <= number; ++i) 
    { 
    if (number % i == 0) 
    { 
     return false; 
    } 
    } 
    return number > 1; 
} 

UP: Auch wenn Sie erwarten, dass Ihr Programm für Zahlen ausgeführt werden können, die zu std::numeric_limits<int>::max() nahe sind, dann Linie i * i überlaufen kann. In diesem Fall können Sie verwenden weniger lesbar, aber sicherere Alternative:

i <= number/i 
+1

(dieser Kommentar ist falsch) 'Nummer% 1 'wird immer Null sein, damit das Programm nicht korrekt ist. – MikeCAT

+0

Ah, ich habe verstanden, was das Programm bedeutet und mein vorheriger Kommentar ist falsch. – MikeCAT

+0

Plus eins für 'i * i <= Nummer' allein. – Bathsheba

0

Sie aufgerufen undefinierten Verhalten von 0 als zweiten Operanden von % Operator (N3337 5.6 Multiplikative Operatoren, Absatz 4), und es scheint gemacht der Programmabsturz. Sie sollten anfangen, von 1, nicht 0 zu iterieren.

Eine weitere Anmerkung ist, dass ganze Zahlen, die 1 oder weniger sind, nicht prim sind, daher sollten sie vor der Schleife zurückgewiesen werden.