2016-08-16 5 views
-1

문제점에 대한 내 대답 PRIME1 제 설명을 잘못 입력 했습니까? 세그먼트 오류가 발생했습니다. 여기spoj의 PRIME1에서 세그먼트 화 오류가 발생합니다. 어떻게 그것을 근절해야합니까?

그것이 :

#include<cstdlib> 
    #include<iostream> 

using namespace std; 

int main(int argc, char** argv) { 
int t=0,i=0,m=0,n=0; 
cin>>t; 
while(t--&&t<=10) 
{ 
    cin>>m>>n; 
    if(m>=1&&n-m<=100000) 
    { 
    int prime[n]; 
    for(i=0;i<n;i++) 
     prime[i]=1; 
    for (int i=2; i*i<=n; i++) 
    { 
    if (prime[i] == true) 
    { 
     for (int j=i*2; j<=n; j += i) 
      prime[j] = false; 
    } 
    } 

    for (int k=m+1; k<n; k++) 
     if (prime[k]) 
      cout <<k<<endl; 
    } 
} 
return 0; 
} 
이 버그를 일으키는 것입니다
+2

'int prime [n];'이 너무 커서 스택에 맞지 않을 수 있습니다. 그것은'char * prime = new char [n];'과 같은 것이어야합니다. 그것을 사용한 후에 반드시 [삭제]하는 것을 잊지 마라. (나는 이것을 제출하여 이것을 체크하지 않았기 때문에 대답으로 게시하지 않을 것입니다.) – MikeCAT

+0

'bool prime'은 공간을 덜 차지할 수 있습니다. 'std :: vector '는 훨씬 적은 공간을 차지 하겠지만, SPOJ에서는 그다지 도움이되지 않는 퍼포먼스 히트가 있습니다. – user4581301

+0

확실하지 않은 이유가 여기에 있습니다. 아마도 나는 학교 교육이 필요합니다 ... – user919426

답변

0
for (int j=i*2; j<=n; j += i) 
prime[j] = false; 

은, 프라임 마지막 멤버의 인덱스를 의미 크기 n의 배열입니다 문이은에 시도, N-1

for(int j=i*2; j<n; ++j) 

편집 : 아마도 세그멘테이션 결함으로 인해 발생하는 마지막 반복에서 액세스 프라임 [N] (j <가 = N, 즉, N은 여전히 ​​유효)이 변화를하는 상태를 해결하는 코드의 형식이 잘못되었거나 잘못된 형식으로 코드를 컴파일 한 후에 잘 컴파일되고 세분화 오류가 발생하지 않습니다 (입력 {1,2,3} 및 {10,10,10} 및 몇 가지 조합으로 시도) :

#include <cstdlib> 
#include <iostream> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    int t=0,i=0,m=0,n=0; 
    cin>>t; 

    while(t--&&t<=10) 
    { 
     cin>>m; 
     cin>>n; 
     if(m>=1&&n-m<=100000) 
     { 
      int prime[n]; 

      for(i=0;i<n;i++) 
      { 
       prime[i]=1; 
      } 

      for (int i=2; i*i<=n; i++) 
      { 
       if (prime[i] == true) 
       { 
        for (int j=i*2; j<=n; j += i) 
        { 
         cout << "poopy\n"; 
         prime[j] = false; 
        } 
       } 
      } 

     for (int k=m+1; k<n; k++) 
     { 
      if (prime[k]) 
      { 
       cout <<k<<endl; 
      } 
     } 
     } 
    } 
    return 0; 
} 
+0

didnt는 일한다. 동일한 세그먼트 화 오류 : ( – ANiK3T

+0

우분투 64 비트 시스템에서 코드를 시도하고 "작동"(아니 세그먼테이션 오류,하지만 논리에 대해 잘 모르겠습니다), 편집 추가 – monkeyStix

+0

논리 괜찮습니다. 내가 ideone에 대한 코드를 시도했다. 모든 것이 잘되지만 SPOj의 이상한 세분화 오류 : | – ANiK3T

관련 문제