2016-09-19 4 views
0

Ich versuche, eine Liste von Mersenne Primzahlen mit dem grundlegendsten möglichen Code auszugeben (Ich bin ein absoluter Anfänger zu C++). Mein Compiler (XCode) kompiliert und führt es erfolgreich aus, aber zeigt kein Ergebnis an. Das Ausgabefenster verschwindet einfach, wenn ich es ausführe. Kann jemand auf die Fehler in meinem Code hinweisen (ohne weitere Dinge wie Funktionen/Dateien usw. hinzuzufügen?) Wenn es nicht möglich ist, könnte jemand einen anderen Code vorschlagen? Vielen Dank.Code zur Ausgabe Mersenne Primes funktioniert nicht

// 
// main.cpp 
// meressene 
// 
// Created by Chiraag Thakur on 19/09/16. 
// Copyright (c) 2016 Chiraag Thakur. All rights reserved. 
// 

#include <iostream> 
#include<math.h> 
using namespace std; 

int main(int argc, const char * argv[]) { 
    int i, n; 
    unsigned long int p, prime, a; 
    for (i=2; i<=(p/2); ++i,++p) { 
     if(p%i==0){ 
      ;} 
     else if(p<1.79E+308){ 
      a=pow(2, p); 
      prime=a-1; 
      for(n=2;n<=(prime/2);++n) 
       if(prime%n==0){ 
        ; 
       } 
       else{ 
        cout<<prime<<"\n"; 
       } 
     } 
    else if (p>=1.79E+308) 
    {exit(0); 

    } 

    } 


    return 0; 
} 
+0

Funktioniert es, wenn Sie ein Terminal öffnen und das Programm von dort ausführen? –

+6

Sie laufen bis 'p/2', aber Sie setzen' p' nie auf einen Wert. –

+0

Lieber 'return 0' in' main' anstelle von 'exit (0)' verwenden. –

Antwort

0

Könnte jemand die Fehler in meinem Code hinweisen (ohne mehr Dinge wie Funktionen/Hinzufügen von Dateien, usw.?)

Sie i und p in der gleichen Schleife iteriert :

for (i=2; i<=(p/2); ++i,++p) { 

Dies sollte eine verschachtelte Schleife sein. Anstatt gehen bis i<=(p/2) oben oder unten n<=(prime/2):

for(n=2;n<=(prime/2);++n) 

wir an der Wurzel stoppen sollten. Aber da sqrt() auf Doppel basiert, werden wir die Gleichung umdrehen auf dem Platz statt:

n * n <= prime 

Da pow() auch auf Typ basiert double, wir werden es in diesem Ausdruck vermeiden:

a=pow(2, p); 

und verwenden Sie stattdessen eine Verschiebung 2UL << (p - 1). Ich bin mir nicht sicher, wo diese Grenze stammt:

p<1.79E+308 

(Wo ist dein Code Kommentar?) Ich werde die Schleife auf die höchste Potenz von zwei begrenzen, die nicht dem unsigned long Integer-Typ nicht überlaufen. Für die Performance wechsle ich nur zu ungeraden Zahlen, nicht zu allen Zahlen und behandle Mersenne prime 3 als Spezialfall. Der überarbeitete Code:

#include <stdio.h> 
#include <stdbool.h> 

#define MAXIMUM_EXPONENT (63) // OSX uses 64 bit unsigned long 

int main(int argc, const char * argv[]) { 

    printf("%lu\n", 3UL); // get first Mersenne prime out of the way to simplify code 

    for (unsigned int number = 3; ; number += 2) { 
     bool is_prime = true; 

     for (unsigned int divisor = 3; divisor * divisor <= number; divisor += 2) { 
      if (number % divisor == 0) { 
       is_prime = false; 
       break; 
      } 
     } 

     if (is_prime) { 
      if (number <= MAXIMUM_EXPONENT) { 
       unsigned long int mersenne_number = (2UL << (number - 1)) - 1; 
       bool is_mersenne_prime = true; 

       for (unsigned long int divisor = 3; divisor * divisor <= mersenne_number; divisor += 2) { 
        if (mersenne_number % divisor == 0) { 
         is_mersenne_prime = false; 
         break; 
        } 
       } 

       if (is_mersenne_prime) { 
        printf("%lu\n", mersenne_number); 
       } 

      } else { 
       break; 
      } 
     } 
    } 

    return 0; 
} 

benutzte ich C statt C++ als die zusätzlichen Funktionen von C++ wurden in Ihrer ursprünglichen Code nicht verwendet.

OUTPUT

> ./a.out 
3 
7 
31 
127 
8191 
131071 
524287 
2147483647 
2305843009213693951 
> 

Natürlich ist dies der falsche Weg, über die Suche nach Mersenne-Primzahlen zu gehen, aber man wollte „die grundlegendsten möglichen Code“ verwenden.