2012-12-20 2 views
6

내가이 간단한 프로그램이 컴파일되지 : g++ -O2 -c -o prob3.o prob3.cpp로 컴파일주()을 실행하지만,

// Include libraries 

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

// Include locals 

// Start 

#define NUMBER 600851475143 

int main(int argc, const char* argv[]) 
{ 
    long long int ans = 0; 
    long long int num = NUMBER; 

    vector<int> factors; 

    do 
    { 
     // Get lowest factor 

     for (int i = 1; i <= num; ++i) 
     { 
      if (!(num % i)) 
      { 
       factors.push_back(i); 

       num /= i; 
       break; 
      } 
     } 
    } while (num > 1); 

    cout << "Calculated to 1.\n"; 

    int highestFactor = numeric_limits<int>::min(); 

    for (int i = 0; i < factors.size(); ++i) 
    { 
     if (factors[i] > highestFactor) 
     { 
      highestFactor = factors[i]; 
     } 
    } 

    ans = highestFactor; 

    cout << ans << endl; 

    return EXIT_SUCCESS; 
} 

이 성공적으로 입증,하지만 난 그것을 실행했을 때 나는 아무것도 보지 않았다하고 그냥 계속 실행하고 나는 Ctrl-C를로했다가 (강제 박멸).

int main(int argc, const char* argv[]) 
{ 
    cout << "Test\n"; 

을 프로그램에 추가하려고하면 Test도 인쇄되지 않습니다. 내 프로그램이 전혀 실행되지 않는 것과 같습니다.

도움이나 의견을 보내 주시면 감사하겠습니다. 나는 소수를 잊어

솔루션 for (int i = 2로 변경 for (int i = 1에서 시작했다.

+1

작업 관리자/ps에서 실행중인 것으로 보입니까? – amit

+0

컴파일 명령은 실행 파일을 생성하지 않고 단지 객체 파일 만 생성합니다. 링크 단계가 있습니까? –

+5

'cout << "Test"<< endl;'endl'은 한 번 (즉 드문 경우이지만) 수행하기에 좋은 스트림을 플러시합니다. –

답변

7

이러한 중첩 루프는 계속 반복됩니다. 내부 for 루프는 break 때문에 한 번만 실행되므로 num /= 1 만 실행됩니다. 즉, num이 결코 감소하지 않으므로 num > 1은 결코 거짓이 아닙니다. 나는 당신이 단지 더 오래 기다릴 필요가 있다고 생각한다!

"테스트"가 표시되지 않는 이유는 출력을 플러시하지 않았기 때문일 수 있습니다. 시도해보십시오 :

std::cout << "Test" << std::endl; 
+0

아, 이제 홍조가납니다. 감사! 나는 내 루프를 점검해야 할 것이다 ... –

+1

@ihsoyih 내가 업데이트했다. 그것은 오랜 시간이 걸리지 않고 영원히 계속됩니다. –

+4

@ihsoyih는 내부 루프의 '1'을 '2'로 변경합니다. –

2

프로그램이 단순히 실행 중입니다. 실행하는 데 시간이 오래 걸립니다.

cout << "Test\n";의 경우 cout 스트림이 플러시되지 않습니다. 스트림에 작성한 내용은 여전히 ​​프로그램 메모리에 있으며 아직 인쇄 할 시스템으로 플러시되지 않았습니다.

1

2에서부터 조건을 시작하려 했습니까? 시작 1.

에서 (! (NUM 개 %의 난))

민/1주고 0, 당신이 경우 조건에 입력하지 않을 그렇다면하면 모듈의 기능은 의미가없는

+0

lol, 예. 수학 문제. –

0

루프는 무한 루프입니다. 첫 번째 요소는 1 (num % 10이므로)이고, 따라서 num을 으로 나눈 결과, num은 반복적으로 반복되는 for 루프를 다시 입력합니다.

이 고정 (2으로 루프의 i 초기화)으로, 내부 for 루프는 대부분 무한 루프이거나 UB를 유발할 가능성이 큽니다. 그렇지 않으면 (다른 사람들이 말했듯이) "아주"계속 실행됩니다. 다른 경우 (여기에서 가장 일반적인 플랫폼이라고 가정). 첫 번째 요소가 std::numeric_limits<int>::max()보다 작 으면 고려해야하는 값에 따라 달라지며 적용되지 않습니다. 그 소수를 BIGPRIME (600851475149)이라고 부를 수 있습니다.

long long int의 크기는 64 비트 이상입니다.int은 대부분의 플랫폼에서 32 비트보다 크지는 않을 것이므로 플랫폼에서 더 크지 않을 경우 (여기서는 일반적인 32 비트 플랫폼이라고 가정) 2147483647까지 올라갈 수 있습니다. long long int 그러나 그 값은 항상 BIGPRIME보다 작습니다. 언제나 i을 늘리는 일은 결코 일어나지 않으며, 일단 max()에 들어가면 부호있는 정수가 C++로 감싸지 않으므로 UB 랜드로 들어갑니다. 귀하의 코드가 무한 루프 될 수도 있고, -1을 유효한 요소로 기록하거나 임신을시키는 것과 같은 일을 할 수도 있습니다.

당신은 쉽게 for 루프에 일부

if(0 == (i%100000000)){ std::cout << i << std::endl; } 

을 추가하여 그것을 관찰 할 수있다.

관련 문제