在这里,我想找到200万以下所有素数的总和.我使用了Eratosthenes的筛子,所以我需要一个200万个阵列.
起初,我只将数组声明为全局变量,但zsh给我一个分段错误.所以我尝试了malloc,但错误仍然存在.我已经测试过小数组,程序运行正常.
此外,我使用clang-1000.10.44.2,使用-O2程序可以工作,但答案是不正确的.代码如下.
#include <stdio.h>
#include <stdlib.h>
#define MAXN 2000000
unsigned long long sum;
void erat(int maxn, char *flag)
{
flag[0] = 0;
flag[1] = 0;
for(int i = 2; i < maxn; i++)
if(flag[i])
for(int j = i * i; j < maxn; j+=i)
flag[j] = 0;
}
int main()
{
int i;
char *flag = (char*) malloc(MAXN * sizeof(char));
for(i = 0; i < MAXN; i++)
flag[i] = 1;
erat(MAXN, flag);
for(i = 0; i < MAXN; i++)
if(flag[i]) sum+=i;
printf("%llu\n", sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
希望有人可以帮助我,谢谢你的时间!
当i被46349,i*i是2148229801,这是比配合更的整数,以便溢出到-2146737495,因为这是小于maxn,flag[j] = 0则执行这是出数组所以崩溃界.
更改j以long long修复错误:
for (long long j = (long long)i * i; j < maxn; j += i)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |