【问题标题】:Code to output Mersenne Primes is not working输出梅森素数的代码不起作用
【发布时间】:2016-09-19 16:45:46
【问题描述】:

我正在尝试使用最基本的可能代码输出梅森素数列表(我是 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;
}

【问题讨论】:

  • 打开终端并从那里运行程序是否有效?
  • 您一直运行到p/2,但您从未将p 设置为值。
  • 更喜欢在main 中使用return 0 而不是exit(0)
  • 使用左移通常比pow(2,x)更有效。
  • 您应该在程序结束时提示用户按 Enter。这应该保持控制台窗口打开,直到按下 Enter 键。

标签: c++ xcode primes


【解决方案1】:

有人能指出我的代码中的错误吗(不添加更多 诸如函数/文件之类的东西?)

您在同一循环中迭代 ip

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

这应该是一个嵌套循环。而不是直到上面的i&lt;=(p/2) 或下面的n&lt;=(prime/2)

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

我们应该停在平方根上。但由于sqrt() 是基于双精度数的,我们将把方程转为正方形:

n * n <= prime

由于pow() 也是基于类型double,我们将在这个表达式中避免它:

a=pow(2, p);

并改用换档2UL &lt;&lt; (p - 1)。我不确定这个限制的来源:

p<1.79E+308

(您的代码注释在哪里?)我将把循环限制为不会溢出无符号长整数类型的 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++ 的附加功能。

输出

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

当然,这是寻找梅森素数的错误方法,但您想使用“最基本的可能代码”。

【讨论】:

    猜你喜欢
    • 2020-02-03
    • 2020-09-08
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多