2017-06-19 3 views
0

Ich habe eine Aufgabe:Berechnung und Datenlimits

auf Notebook in der Zelle (standart ausgerastert Notebook für Mathe/Zahlen) gemalt Rechteck mit Größe NxM (intergers). Wie viele verschiedene Rechtecke können dieses Rechteck enthalten?

Max-Wert für N und M ==^9 10 (1 000 000 000)

Wenn Ergebnis> = (10^9 + 7) anzeigen: Ergebnis mod (10^9 + 7)

Beispiel: Examples

ich weiß Formel:

M * (M + 1) * N * (N + 1)/4

und erkennen dieses Problem in C++:

#include <iostream> 
#include <cmath> 
#include <iomanip> 
int main() 
{ 
    long double n, m; 
    std::cin >> n >> m; 
    long double n1 = (n*(n + 1)/2); 
    long double m1 = (m*(m + 1)/2); 
    long double count = std::fmod((n1 * m1), 1000000007); 
    std::cout << std::fixed << std::setprecision(0) << count; 
    return 0; 
} 

Aber wenn ich für den Test 1000000000 x 1000000000 schrieb

Mein Programm angezeigt mich 499.881.764, wenn Windows calclulator und other calculator 441 angezeigt = _ =

was falsch ist habe ich? Ich wäre sehr dankbar, wenn jemand ein Codebeispiel der richtigen Lösung zeigen könnte.

Antwort

0

Sie verlieren Präzision im long double Typ: Die Tatsache, dass Ihre beobachtete Ausgabe ein Vielfaches einer Potenz von 2 ist, ist ein Prüfstein für diesen Effekt.

Da Sie Windows verwenden, ist mein Geld auf long double ein 64-Bit IEEE754 Double Precision Fließkomma Typ (d. H. Das gleiche wie ein double auf dieser Plattform), und das gibt Ihnen 53 Bits Genauigkeit.

Sie können zu einer beliebigen Genauigkeitsbibliothek wechseln, oder Google "Schranges Algorithmus" für eine clevere Methode zur Berechnung des Moduls für ein Produkt.

+0

Können Sie ein Codebeispiel für eine korrekte Lösung anzeigen? – NemoUA

+0

Können Sie diesen Algorithmus und Beispiel damit zeigen, ich bin so noobie in der Arbeit mit Zahlen in C++. – NemoUA

Verwandte Themen