Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找区间之间的素数之和(C+;+;程序不适用于大数)_C++ - Fatal编程技术网

C++ 查找区间之间的素数之和(C+;+;程序不适用于大数)

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;

我的代码如下。当间隔不是很大时,它工作得很好。然而,每当我超过一百万,程序就会停止。例如,对于区间2到2000000,素数的总和应该是142913828922(从书的后面),而我的应用程序显示117908154。有人能指出我哪里出错了吗

#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(尽管我承认我还没有准备好引证)。