2013-06-07 3 views
-3

나는 소수의 배열을 가지고있다. 이 배열의 길이는 1,000,000입니다. 이것은 마지막 요소 소수 [999999]가 100 만 번째 소수를 가져야한다는 것을 의미합니다. 실제로 처음 2 개를 떠난 이후로 1,000,000 번째 소수를 가져야합니다.배열의 정확성을 어떻게 확인할 수 있습니까?

프로그램을 실행하고 배열의 마지막 요소를 뱉어 내면 999,999 번째 소수가 튀어 나옵니다. 나는 C를 배우는 중입니다. 그리고 이것은 제가 수강하는 수학 수업을위한 약간의 숙제 프로젝트입니다. 나는이 문제에 대한 나의 문제 해결에서 어디서부터 시작할 지 전혀 모른다. 어떤 도움이라도 대단히 감사하겠습니다.

편집 : 죄송합니다. 웬일인지 쉽게 대답 할 수 있다고 생각했습니다. 아래 코드를 게시했습니다. 나는 옵션 1에서 소수의 배열을 출력했고 모든 소수는 정확하고 결과는 정확하다. 다른 옵션과 나는 잘못된 출력을 얻을.

void createArray(int, unsigned long long *); 
unsigned long long root(unsigned long long); 
void print(unsigned long long *, int); 

int main(void){ 

    unsigned long long *prime = (unsigned long long *)calloc(SIZE6, 
            sizeof(unsigned long long)); 
    unsigned long long *ptrEmpty = &prime[15]; 
    unsigned long long i; 
    unsigned long long j; 
    long int sizeComp; 
    int flag = 0; 
    unsigned long option = 0; 
    int length = 0; 

    system("clear"); 

    do{ 
     flag = 0; 
     option = -1; 

     printf("Welcome to the prime number finder program. Below are a list " 
      "of prime numbers\nyou can find as well as their average runni" 
      "ng time on the Loki system of UNO.\n\nOption 1: Return the 10" 
      "0th prime number. (Running time: .006s)\nOption 2: Return t" 
      "he 1000th prime number. (Running time: .008s)\nOption 3: Re" 
      "turn the 10000th prime number. (Running time: .089s)\nOptio" 
      "n 4: Return the 100000th prime number. (Running time: 2.188s" 
      ")\nOption 5: Return the 1000000th prime number. (Running ti" 
      "me: 57.156s)\nOption 6: Return the 10000000th prime number. " 
      "(**CAUTION!** Running time: 35m51.3s)\n\nEnter the number o" 
      "f the option you would like the program to\nperform (Enter 0 " 
      "to exit): "); 

     scanf("%lu", &option); 

     switch(option){ 

      case 0: 
       flag = 1; 
       break; 
      case 1: 
       createArray(SIZE1, prime); 
       ptrEmpty = &prime[15]; 
       length = SIZE1; 
       break; 
      case 2: 
       createArray(SIZE2, prime); 
       ptrEmpty = &prime[15]; 
       length = SIZE2; 
       break; 
      case 3: 
       createArray(SIZE3, prime); 
       ptrEmpty = &prime[15]; 
       length = SIZE3; 
       break; 
      case 4: 
       createArray(SIZE4, prime); 
       ptrEmpty = &prime[15]; 
       length = SIZE4; 
       break; 
      case 5: 
       createArray(SIZE5, prime); 
       ptrEmpty = &prime[15]; 
       length = SIZE5; 
       break; 
      case 6: 
       createArray(SIZE6, prime); 
       ptrEmpty = &prime[15]; 
       length = SIZE6; 
       break; 
      default: 
       printf("Please enter one of the available options (1 - 7) " 
       "or 0 to exit: "); 
      flag= 1; 
      break; 
     } 

     if(flag != 1){ 
      for(i = START, sizeComp = 15; sizeComp <= length; i += 2){ 

       flag = 0; 
       for(j = 0; prime[j] < root(i); j++){ 

        if((i % prime[j]) == 0){ 
         flag = 1; 
         break; 
        } 
       } 

       if(flag == 0){ 
        *ptrEmpty = i; 
        ++sizeComp; 
        ptrEmpty++; 
       } 
      } 

      printf("\nThe %dth prime number is %llu.\n\n", length, 
        prime[ length - 2 ]); 

//   print(prime, length); 
      printf("****************************************" 
        "****************************************\n\n"); 

    } 

    }while(option != 0); 

    free(prime); 

    return 0; 
} 

void print(unsigned long long *prime, int length){ 

    int i; 
    printf("\n%4d", 2); 
    for(i = 0; i < length; i++){ 
     printf("%4llu ", prime[i]); 
    } 
    printf("\n"); 
} 

void createArray(int length, unsigned long long *prime){ 

    unsigned long long *pHolder = NULL; 

    pHolder = (unsigned long long *)realloc(prime, length * 
             sizeof(unsigned long long)); 

    if(pHolder != NULL){ 
     prime = pHolder; 
    }else{ 
     free(prime); 
     printf("Error reallocating memory.\n"); 
     exit(1); 
    } 

    prime[0] = 3; 
    prime[1] = 5; 
    prime[2] = 7; 
    prime[3] = 11; 
    prime[4] = 13; 
    prime[5] = 17; 
    prime[6] = 19; 
    prime[7] = 23; 
    prime[8] = 29; 
    prime[9] = 31; 
    prime[10] = 37; 
    prime[11] = 41; 
    prime[12] = 43; 
    prime[13] = 47; 
    prime[14] = 53; 
} 

unsigned long long root(unsigned long long a) { 

    unsigned long long rem = 0; 
    unsigned long long root = 0; 
    int i; 

    for (i = 0; i < 16; i++) { 
     root <<= 1; 
     rem <<= 2; 
     rem += a >> 30; 
     a <<= 2; 

     if (root < rem) { 
      root++; 
      rem -= root; 
      root++; 
     } 
    } 

    return (root >> 1); 
} 

편집 : 크기 1 = 100, SIZE2 = 1000, SIZE3 = 10000, SIZE4 = 100000, SIZE5 = 1000000, SIZE6 = 10000000

+7

일부 코드를 표시하는 것은 어떻습니까? 우리는 독자들을 신경 쓰지 않습니다. – OldProgrammer

+0

코드를 게시하면 누군가가 버그를 지적 할 가능성이 높습니다. 스스로 알아 내고 싶다면 프로그램이 실행되는 동안'printf'를 사용하여 디버그 정보를 출력 해 볼 수 있습니다. 우선 배열의 시작 부분을 인쇄하여 처음 두 소수를 무시하는지 확인하십시오. – simonc

+0

@OldProgrammer 위의 게시물에 추가 정보와 함께 코드를 추가했습니다. – user1362058

답변

3

당신은 당신의 배열 크기를 변경하여,이 디버깅에 대한 갈 수 5, 처음 5 개의 소수만을보고 5 개를 모두 출력하고 실제로 2 3 5 7 11 (또는 3 5 7 11 13)인지 또는 거기에 오류가 있는지 확인하십시오.

아마도 거기에 오류가 존재할 수 있습니다. 그러면 더 작은 경우에 대해 오류를 수정할 수 있으며 더 큰 경우에는 문제가 해결됩니다.

+0

이상한 점은 배열의 크기가 100으로 설정되어 있어도 배열이 완벽하다는 것입니다. 크기가 더 크면 출력이 올바르지 않습니다. 나는 출력되는 1000 개의 숫자를 살펴보고 각 숫자가 일치하는지 확인하기 위해 인내심을 가지고 있지 않습니다. 현재 내가 작업중인 코드로 원래 게시물을 업데이트 했으므로 다른 사람이 내 코드에서 오류를 찾을 수 있습니다. – user1362058

+0

찾고있는 번호의 이진 검색 (잘못된 소수 일 것임), Size2를 500으로 변경 한 다음 750을 확인한 다음 875를 입력하고 계속 진행하면 정확한 결과를 찾을 수 있습니다. # 당신의 프로그램을 꽤 쉽게 망치고있다. 그리고 그 시점에서 아마도 그것이 작동하지 않는 이유에 대해 이해할 수있는 그 숫자에 대해 특정한 것이있을 것입니다. – NolanPower