我的程序的主要目标是打印2和限制之间的所有素数。当我使用limit = 35000或甚至limit = 50000运行它时,它打印正确,但是当我尝试使用limit = 75000运行它时,它会给我一个分段错误。知道为什么吗?我能做些什么才能获得更好的表现? (基于Sundaram算法的解决方案)
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000000
int main() {
int vetor[MAX];
int limite;
scanf("%d", &limite);
for (int i = 0; i <= limite; i++){
vetor[i] = i;
}
/* Marcar todos os compostos */
for (int i = 1; i < limite/2; i++){
for (int j = i; j< limite/2; j++){
long aux = i + j + 2 * i * j;
if(aux <= limite)
vetor[aux] = 0;
}
}
/* Imprimir os verdadeiros primos, incluíndo o 2 */
printf("2\n");
for (int i = 1; i <= limite; i++){
if (vetor[i] != 0){
long aux = i*2 + 1;
if (aux < limite){
printf("%ld\n",aux);
}
}
}
return 0;
}
答案 0 :(得分:3)
试试这个。我将 $sql = mysql_query("UPDATE table SET value=value+1 WHERE id='$id'");
,i
和j
更改为&#39; unsigned long long&#39;。你的问题是溢出的。这意味着您的整数变得大于最大整数值。希望aux
不是最大的整数数据类型。最大的是int
。但无论如何,请记住,当你遇到这个问题时,有一定的限制。
unsigned long long
答案 1 :(得分:1)
类型long
(或long int
)是一个整数类型,大于或等于int
类型的大小。
键入long long
大于unsigned long.
键入unsigned long long
大于long long
。
阅读此Data Type Ranges。
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000000
int main() {
int vetor[MAX];
int limite;
scanf("%d", &limite);
for (int i = 0; i <= limite; i++){
vetor[i] = i;
}
/* Marcar todos os compostos */
for (int i = 1; i < limite/2; i++){
for (int j = i; j< limite/2; j++){
unsigned long long aux = i + j + 2 * i * j;
if(aux <= limite)
vetor[aux] = 0;
}
}
/* Imprimir os verdadeiros primos, incluíndo o 2 */
printf("2\n");
for (int i = 1; i <= limite; i++){
if (vetor[i] != 0){
long aux = i*2 + 1;
if (aux < limite){
printf("%ld\n",aux);
}
}
}
return 0;
}