我在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
答案 0 :(得分:5)
我猜你是在32位机器上,2^32
或33
或34
都会溢出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)都是素数。