2016-05-10 3 views
3

ich auf ein Problem gestoßen, während ich in C wurde die Umsetzung des vorgegebenen Algorithmus:Wie in C, um herauszufinden, ob eine doppelte Anzahl irgendwelche Ziffern hinter dem Komma hat

int getNumberOfAllFactors(int number) { 

    int counter = 0; 
    double sqrt_num = sqrt(number); 
    for (int i = 1; i <= sqrt_num; i++) { 
     if (number % i == 0) { 
      counter = counter + 2; 
     } 
    } 
    if (number == sqrt_num * sqrt_num) 
     counter--; 

    return counter; 
} 

- der Grund für die zweite Bedingung - ist macht eine Korrektur für perfekte Quadrate (dh 36 = 6 * 6), aber es nicht Situationen (False Positive) vermeiden wie diese:

sqrt(91) = 18.027756377319946 
18.027756377319946 * 18.027756377319946 = 91.0 

Also meine Fragen sind: wie es zu vermeiden, und was ist die beste Weg in C-Sprache, um herauszufinden, ob eine doppelte Zahl irgendwelche Nachkommastellen hat? Sollte ich Quadratwurzel-Werte von Double auf Integer anwenden?

Antwort

4

In Ihrem Fall könnten Sie es wie folgt testen:

if (sqrt_num == (int)sqrt_num) 
+1

Wird nicht die RHS (impliziten) vor dem Vergleich zu 'double' wieder umgewandelt werden? – CinCout

+4

@CinCout Das wird kein Problem sein, der Dezimalteil wurde bereits verworfen, wenn an "int" geworfen wird. –

+0

Ja. Macht Sinn. – CinCout

4

Sie wahrscheinlich die modf() Familie von Funktionen verwenden sollten:

#include <math.h> 
double modf(double value, double *iptr); 

Die modf Funktionen brechen den Argumentwert in integralen und Bruchteile, jeweils von , die den gleichen Typ und das gleiche Zeichen wie das Argument haben. Sie speichern den Integralteil (in Gleitkommaformat) in dem Objekt, auf das iptr zeigt.

Dies ist zuverlässiger als der Versuch, direkte Conversions int zu verwenden, da ein int typischerweise eine 32-Bit-Zahl ist und ein double kann in der Regel weit größere ganzzahlige Werte speichern (bis zu 53 Bit Wert), so können Sie laufen in Fehler unnötig. Wenn Sie entscheiden, dass Sie eine Konvertierung zu int verwenden müssen und mit double Werten arbeiten, verwenden Sie mindestens long long für die Konvertierung statt int.

(Die anderen Mitglieder der Familie sind modff() die float und modfl() Griffe, die long double Griffe.)

+0

@wintermute "** bester ** Weg in C-Sprache, um herauszufinden, ob eine Doppelnummer irgendwelche Nachkommastellen hat?" -> benutze 'modf()'. Die Verwendung von 'int()' oder 'sqrt (number)' begrenzt den Bereich der Erkennung von "beliebigen Nachkommastellen" in "double" über andere Methoden. – chux

Verwandte Themen