2016-09-19 19 views
0

私はメルセヌン素数のリストを最も基本的なコードを使用して出力しようとしています(私はC++の初心者です)。私のコンパイラ(XCode)は正常にコンパイルして実行しますが、結果は表示されません。出力ウィンドウは、実行すると消えます。誰かが私のコードでエラーを指摘できますか?(関数やファイルなどを追加することなく)?可能でない場合は、別のコードを提案することができますか?ありがとう。メルセンヌプライムを出力するコードが動作していません

// 
// 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

端末を開いてそこからプログラムを実行すると機能しますか? –

+6

'p/2'まで実行しますが、' p'を決して値に設定しません。 –

+0

'exit(0)'ではなく 'main'で' return 0'を使うのが好ましいです。 –

答えて

0

誰かが(など、機能/ファイルのような、より ものを追加せずに?)私のコードでエラーを指摘してもらえ

あなたは同じループ内ipを反復しています:

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

これはネストされたループである必要があります。むしろよりi<=(p/2)上または下n<=(prime/2)まで行く:

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

我々は平方根で停止する必要があります。 sqrt()がダブルスに基づいているのでしかし、我々は代わりに、正方形に周りの方程式を有効にします:pow()以来

n * n <= prime 

も種類doubleに基づいており、我々はこの式の中でそれを避けるだろう:

a=pow(2, p); 

とし、シフト2UL << (p - 1)を代わりに使用してください。この制限に起因するところ私はわからない:

p<1.79E+308 

(どこにあなたのコードのコメントだ?)私はunsigned long型の整数型をオーバーフローしない2の最高出力にループを制限するつもりです。パフォーマンスのために、私はすべての数字ではなく、ちょうど奇数に切り替えるつもりで、特殊ケースとしてメルセンヌプライム3を処理します。リワークコード:

#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; 
} 

私はCを代わりに使用するC++の追加機能としてC++があなたの元のコードで使用されていませんでした。もちろん

OUTPUT

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

、これはメルセンヌ素数を見つけることについて行くには間違った方法ですが、「最も基本的な可能コード」を使用したかったです。

関連する問題