2016-04-23 17 views
1

Mein Code ist folgende:Eine seltsame C++ Fehler, vielleicht ist es in Bezug auf den langen langen Typ

#include <iostream> 
int gcd(int a, int b) { 
    //write your code here 
    if(a==0){ 
    return b; 
    }else if(b==0){ 
    return a; 
    }else if(a>b){ 
    int a_pri=a%b; 
    return gcd(b,a_pri); 
    }else if(a<b){ 
    int b_pri=b%a; 
    return gcd(a,b_pri); 
    }else{ 
    return a; 
    } 
} 
long long lcm(int a, int b) { 
    int temp_gcd = gcd(a,b); 
    long long abproduct = a*b; 
    long long result = abproduct/temp_gcd; 
    return result; 
} 

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

Ich würde das größte gemeinsame Vielfache von zwei Zahlen mögen ausgegeben. aber wie ich zwei Zahlen eingeben 14159572 63967072, Es gibt eine negative Zahl -527892768.Aber die richtige Antwort sollte 222636590403296 sein. Es sieht aus wie die Ausgabe auf 32bit abgeschnitten wird. so, ich die Variable temp_gcd drucken, ist es 4.Ich

den Ausdruck verändert
long long result = abproduct/temp_gcd; 

zu

long long result = abproduct/4; 

Dann gibt es die richtige Antwort.

+0

Vorschlagen mit unsigned Typen für alles: '%' operator funktioniert sowieso nicht mit negativen rechten Operanden, und das bringt Ihnen etwas mehr Präzision und vermeidet potentiell undefiniertes Verhalten wegen Überlaufs. Vielleicht benutze 'uintmax_t' –

Antwort

1

Sie führen eine int Multiplikation durch, weil das der Datentyp der Operanden ist. Ändern Sie diesen Datentyp. Dh, ändern

long long lcm(int a, int b) 

zu

long long lcm(long long a, long long b) 

den Rat Abgüsse Nehmen Sie nicht zu verwenden: ein Guss sollte immer das Maß der letzte Ausweg sein, wie in den Krieg (nur nach Politiker und Diplomaten scheitern). Wenn Sie die Funktionssignatur nicht ändern, können Sie eine Konvertierung erzwingen, indem Sie a*b durch 1LL*a*b ersetzen. Aber ich empfehle das hier nicht. Die Verwendung geeigneter Datentypen ist der richtige Weg.

noch der Code

long long abproduct = a*b; 
long long result = abproduct/temp_gcd; 

fügt unnötig Fällen, in denen das Ergebnis überlaufen kann. Zu reduzieren, dass

long long result = a*(b/temp_gcd); 

unter Hinweis darauf, dass diese Informationen nicht verwerfen kann (im Allgemeinen, aber haben Sie vorsichtig über Integer-Division Verwerfen Informationen sein).

2

Das Problem ist auf der Linie long long abproduct = a*b;

Da a und b beide int, jede Operation auf sie in einem int führen wird, was zu einem Überlauf in diesem Fall ergibt. Versuchen Sie während der Berechnung entweder a oder b an long long.

long long abproduct = (long long)a * b;

+0

Ein anderer Weg ist' 1LL * a * b' –

0

Wollte nicht die @ MahlerFive Antwort bearbeiten - die funktionieren soll. Ich würde A und B zu lange lang wie-so: long long abproduct = static_cast<long long>(a)*static_cast<long long>(b).