为什么这个Prime数字每次重复

时间:2016-02-11 01:58:48

标签: c++

我在c ++中编写了一个伪随机程序,它基本上是一个for循环,得到当前数字增加到它的数字2并减去1并以最终数字结束,但出于某种原因,当我的程序命中时32号码重复素数,我该如何解决这个重复的问题呢?

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    for (int number = 1; number <= 35; number++)
    {
        int num = pow(2,number);
        int prime = (num - 1);
        cout << "Number: "<< number << " = " << prime <<endl;
    }
    return 0;
}

输出:

Number: 1 = 1
Number: 2 = 3
Number: 3 = 7
Number: 4 = 15
Number: 5 = 31
Number: 6 = 63
Number: 7 = 127
Number: 8 = 255
Number: 9 = 511
Number: 10 = 1023
Number: 11 = 2047
Number: 12 = 4095
Number: 13 = 8191
Number: 14 = 16383
Number: 15 = 32767
Number: 16 = 65535
Number: 17 = 131071
Number: 18 = 262143
Number: 19 = 524287
Number: 20 = 1048575
Number: 21 = 2097151
Number: 22 = 4194303
Number: 23 = 8388607
Number: 24 = 16777215
Number: 25 = 33554431
Number: 26 = 67108863
Number: 27 = 134217727
Number: 28 = 268435455
Number: 29 = 536870911
Number: 30 = 1073741823
Number: 31 = 2147483647
Number: 32 = 2147483647
Number: 33 = 2147483647
Number: 34 = 2147483647
Number: 35 = 2147483647 

2 个答案:

答案 0 :(得分:5)

我猜你是在32位机器上,2^323334都会溢出32位int

你需要一个“更大”的类型。

答案 1 :(得分:1)

当您使用大素数时,建议使用无符号类型,例如unsigned long long。此外,您可以使用以下内容来提高性能:

    unsigned long long num = 1;
    //in for loop
    num = num * 2;

另外,使用单词prime和pseudorandom令人困惑,可能你应该说伪素数?因为有人可能误导你的算法会产生素数。显然,在你生成的列表中有素数(例如31)和非素数(例如255)。 Mersenne素数是素数的子集,也恰好是2 ^ n - 1,并非所有(2 ^ n-1)都是素数。