分段故障C ++ Sundaram

时间:2016-02-18 16:57:35

标签: c++ segmentation-fault

我的程序的主要目标是打印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;
}

2 个答案:

答案 0 :(得分:3)

试试这个。我将 $sql = mysql_query("UPDATE table SET value=value+1 WHERE id='$id'"); ij更改为&#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;
    }