2016-04-09 7 views
-3

Ich habe versucht, Problem 5 von Project Euler zu lösen, aber Programm abstürzt und ich habe nicht einen Fehler:C++ Konsole Programmabstürze ohne Fehler

#include <stdio.h> 
#include <iostream> 

using namespace std; 

/* Problem 5: 
    2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder. 
    What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20? 
*/ 

int selle(int number) { 
    int c = 0; 

    for (int i = 0; i <= 20; i++) 
     if (number % i == 0) 
      c++; 

    return c; 
} 

int problem(int number) { 
    while (number > 0) { 

     if (selle(number) == 20) 
      return number; 

     number++; 
    } 

    return 404; 
} 

int main() { 
    long long number = 2; 

    cout << problem(number); 

    system("PAUSE"); 
    return 0; 
} 

denke ich, das Problem in der „for“ ist Schleife in der ersten Funktion, aber ich weiß nicht, was es ist. Auch wenn man versucht, Funktionen zu setzen, passiert es lange. Danke.

+0

Ich denke, dass Sie voraussichtlich eine Least Common Multiple (LCM) -Funktion in Bezug auf Euklids Greatest Common Divisor (GCD) definiert verwenden. –

+0

FIY, in Windows erzeugt das Programm eine Fehlerbox "Gestoppt arbeiten". In den alten Zeiten ermutigte es den Benutzer, Bill Gates davon zu erzählen. Anscheinend hat das zu viel Arbeit für ihn geschaffen, denn jetzt heißt es, dass Windows nach einer Lösung sucht (Künstliche Intelligenz, yay!), Und ändert sich dann, um entweder das Programm debuggen oder schließen zu lassen. –

+1

Französisch gcc sagt mir 'Ausnahme en point flottant'! – jpo38

Antwort

4
for (int i = 0; i <= 20; i++) 
    if (number % i == 0) 
     c++; 

Wenn i Null (erste Iteration) ist ... Sie durch Null dividiert ... dies ist nicht erlaubt.

Deshalb stürzt Ihr Programm ab.

+0

Oh ja, was für ein dummer Fehler. –

+0

Ich bin froh, dass ich helfen konnte. Wenn das Ihre Frage beantwortet hat, sollten Sie die Stimme abgeben und die Antwort akzeptieren. – jpo38

0

Das Problem ist, dass Sie number % 0 irgendwann ausführen. Wie Division durch Null ist Modulo durch Null auch nicht erlaubt. Wenn der zweite Operand in einer Modulo-Operation 0 ist, führt dies zu undefiniertem Verhalten (http://en.cppreference.com/w/cpp/language/operator_arithmetic).

Übrigens könnten Sie mit long long number = 20; beginnen und die Inkremente um 20 (number += 20;) erhöhen, weil Sie keine Übereinstimmungen dazwischen finden werden.