2012-12-20 4 views
6

ho questo semplice programma:main() non esecuzione, ma la compilazione

// 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; 
} 

compilazione con g++ -O2 -c -o prob3.o prob3.cpp rivelata vincente, ma quando ho eseguito ho visto niente e semplicemente continuato a correre e ho dovuto Ctrl-C (forza-uccide) alla fine. Quando provo ad aggiungere

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

al programma, Test non ha ottenuto stampate troppo. È come se il mio programma non fosse eseguito affatto.

Qualsiasi aiuto o consiglio è apprezzato!

Soluzione

ho dimenticato numeri primi ha iniziato a 2. Cambiare for (int i = 1 a for (int i = 2.

+1

Lo vedi come eseguito nel tuo task manager/ps? – amit

+0

Il comando di compilazione non produrrà un file eseguibile, ma solo un file oggetto. Avete anche una fase di collegamento? –

+5

Prova 'cout <<" Test "<< endl;' 'endl' svuota il flusso, che per una volta (cioè, è raro) è una buona cosa da fare. –

risposta

7

Questi cicli annidati si collegheranno all'infinito. Il ciclo interno for verrà eseguito sempre una sola volta a causa dello break, quindi sarà sempre disponibile solo per num /= 1. Ciò significa che num non diminuisce mai e quindi num > 1 non sarà mai falso. Suppongo che devi solo aspettare più a lungo!

Il motivo per cui non si vede "Test" è probabilmente perché non si è scaricato l'output. Prova:

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

Ah, ora arrossisce. Grazie! Devo solo controllare il mio ciclo ... –

+1

@ihsoyih Ho aggiornato. Non ci vorrà molto tempo, ci vorrà per sempre. –

+4

@ihsoyih cambia semplicemente '1' nel ciclo interno in un' 2'. –

2

Il programma è semplicemente in esecuzione. Ci vuole molto tempo per essere eseguito.

Per il cout << "Test\n";, si tratta del flusso cout non scaricato: ciò che è stato scritto nello stream è ancora nella memoria del programma e non è ancora stato scaricato nel sistema da stampare.

1

Hai provato ad avviare il tuo per condizione da 2? La funzione del modulo non ha senso se inizio dal 1.

if (! (Num% i))

Num/1 0 dare, in modo che stai non entra nella condizione if

+0

lol, sì. Problema della matematica –

0

Il tuo ciclo è un ciclo infinito. Il primo fattore che trovi è 1 (dal num % 1 è 0) e come tale dividi num per 1 che risulta in num che rientra nel ciclo for, che fa sempre lo stesso.

Anche con questo fisso (inizializza i nel loop con 2), il ciclo interno per è molto probabilmente un ciclo infinito e/o causa UB. Altrimenti (come hanno affermato gli altri) è "giusto" correre molto a lungo. Per il caso in cui è diverso (assumendo le piattaforme più comuni qui). Questo dipende dal valore che stai cercando di calcolare, se il primo fattore è inferiore a std::numeric_limits<int>::max(), questo non si applica. Chiamiamo questi numeri primi BIGPRIME (600851475149 sarebbe un buon esempio).

long long int ha una dimensione minima di 64 bit.È improbabile che lo int sia più grande di 32 bit sulla maggior parte delle piattaforme, quindi quando non è più grande sulla piattaforma può andare fino a std::numeric_limits<int>::max() che è (assumendo ancora una volta la piattaforma 32 bit comune) 2147483647 che a sua volta viene promosso nel confronto a long long int ma mantiene il suo valore, che è sempre inferiore a BIGPRIME. Il numero sempre crescente di i non arriva mai da nessuna parte e, una volta arrivato a max(), inserisci UB land come interi con segno non avvolti in C++. Il tuo codice potrebbe avere un loop infinito, o fare cose come registrare -1 come un fattore valido, o renderti incinta.

si può facilmente osservare che con l'aggiunta di un po 'di

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

nel circuito for.