C++ 查找区间之间的素数之和(C+;+;程序不适用于大数)
我的代码如下。当间隔不是很大时,它工作得很好。然而,每当我超过一百万,程序就会停止。例如,对于区间2到2000000,素数的总和应该是142913828922(从书的后面),而我的应用程序显示117908154。有人能指出我哪里出错了吗C++ 查找区间之间的素数之和(C+;+;程序不适用于大数),c++,C++,我的代码如下。当间隔不是很大时,它工作得很好。然而,每当我超过一百万,程序就会停止。例如,对于区间2到2000000,素数的总和应该是142913828922(从书的后面),而我的应用程序显示117908154。有人能指出我哪里出错了吗 #include <iostream> #include <math.h> #define BELOW 2000000; using namespace std; bool isPrime(int num) { int i;
#include <iostream>
#include <math.h>
#define BELOW 2000000;
using namespace std;
bool isPrime(int num)
{
int i;
for (i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return 0;
}
else {
;
}
}
}
int main()
{
long sum = 0;
for (int i = 2; i < BELOW i++) {
if (isPrime(i)) {
sum = sum + i;
printf("sum: %ld\n", sum);
}
}
cin.get();
return 0;
}
#包括
#包括
#定义在2000000以下;
使用名称空间std;
bool isPrime(整数)
{
int i;
对于(i=2;i,您正在处理的问题是
(有符号)long
在大多数机器上的值都在-2147483647
和2147483647
之间
您应该使用较大的数据类型,我建议使用无符号long-long
,在大多数计算机上,它可以保存介于:0
到18446744073709551615
之间的值(至少64位)或者uint64\u t
类型。您应该将所有出现的“int”和“long”替换为“uint64\u t”int
和long
只能容纳这么大的数字。long
可以容纳的最大值是2147483647。显然,您想要的结果大于此值。您必须使用适当的数据类型。因为你想检查数字是否是素数,它们肯定是正数。你可以使用无符号变量将最大值翻倍,不过要解决你的问题,你必须使用“更长”的键入。宏中额外的分号,用于分隔条件和更新部分。真的吗?@Shadid,如果您觉得答案有用,请接受它。uint64\u t
不是更便于移植。unsigned long
保证至少有64位。不能保证存在正好有64位的类型。当然,ha在这里保存更多的位并没有什么坏处。像uint64\u t
这样的类型应该限制在少数应用程序中,因为精确的位大小很重要。您也可以选择使用uint64\u fast\t
或uint64\u至少\u t
,但它们很难看,而且几乎从未使用过。平台支持大于64位的整数类型非常罕见记住,有些人认为使用特定的整数大小是一种很好的做法,即代码在不同的平台上不会有不同的行为。例如,java和.NET不考虑基础平台而固定整数类型的大小,这可能是一种合理的做法。es(尽管我承认我还没有准备好引证)。