2016-04-15 2 views
0

Ich habe versucht, die lcm von zwei Zahlen zu finden und für einen der Eingabefälle (28851539 und 1183019) mein Programm einen negativen Wert zurückgibt. Anscheinend ist es nicht in der Lage zu berechnen (28851529 * 1183019)/9.Berechnung der Ziffern in 10^9 in C++

#include <iostream> 
long long gcd(int a, int b) { 
long long int temp; 
if(a%b==0) 
{ 
    return b; 
} 
else 
{ 
temp=a%b; 
return gcd(b,temp); 
} 
} 
long long lcm(int a, int b , int g) { 
//std::cout<<g; 
long long int f=(a*b)/g; 
return f; 
} 

int main() { 
long long int a, b; 
std::cin >> a >> b; 
long long int g = gcd(a,b); 
long long int q=lcm(a, b, g); 
std::cout << q << std::endl; 
return 0; 
} 

Wie berechne ich das genau?

Antwort

4

Sie Problem ist

long long int f=(a*b)/g; 

da alle Typen in (a*b)/g sind int dann wird dies als int berechnet werden, und wenn ein int 16 oder 32 Bits dann wird es overflow. Beachten Sie, dass dies tatsächlich undefined behavior ist, da Sie Typen signiert haben. Um dies zu umgehen, müssen Sie entweder a, b oder g eine long long int machen oder Sie können die Parameter der Funktion ändern, um sie alle long long int s zu machen.

long long int lcm(long long int a, long long int b , long long int g) 

Ich würde auch vorschlagen, Sie eine unsigned long long int verwenden, wenn Sie nicht mit negativen Zahlen zu tun haben,. Wenn dies nicht der Fall ist, können Sie den Typ uint64_t von <cstdint> verwenden, andernfalls int64_t, um die Typnamen kürzer zu machen.

+0

Danke, das war eine große Hilfe. –

+0

Ich würde nur das hinzufügen [Link auf Integer Overflow ...] (https://en.wikipedia.org/wiki/Integer_overflow) – Charles

+0

@ c650 Danke für den Link. Ich habe diesen Satz umformuliert, weil ich ihn nicht mochte und den Link eingefügt habe. – NathanOliver

Verwandte Themen