2015-11-30 7 views
-1

J'essaye d'écrire un programme en C++ qui va amorcer les nombres de facteur qui ont 12 chiffres. Voici mon code:Pourquoi est-ce que je ne peux pas donner de nombres premiers de facteur au-dessus d'une certaine grandeur?

#include <iostream> 
using namespace std; 

int main() 
{ 
    long double userInput; 
    long double divisor = 2; 
    long double dividend; 

    cout << "Enter number: "; 
    cin >> userInput; 
    dividend = userInput; 

    do 
    { 
    while (static_cast<int>(dividend) % static_cast<int>(divisor) == 0) 
    { 
     cout << divisor << endl; 
     dividend = dividend/divisor; 
    } 

    divisor++; 

    } while (dividend > 1); 

    return 0; 
} 

Ce (semble, au moins) fonctionne très bien pour les petits nombres, mais il tombe en panne quand j'utilise des nombres très élevés. Pourquoi est-ce? Dois-je utiliser un type entier plus grand? Ou est-ce quelque chose qui ne va pas avec le code lui-même?

Répondre

3

L'utilisation de long double pour la factorisation n'a pas beaucoup de sens. Vous voulez un grand type entier pour représenter des nombres entiers. double est typiquement 64 bits, mais il "gaspille" plusieurs de ces bits pour l'exposant afin qu'il puisse représenter des nombres fractionnaires, et aussi des nombres avec une très grande amplitude mais une précision réduite.

De plus, vous devez convertir le dividende et le diviseur en int avant de les diviser. int est très souvent 32 bits, ce qui signifie que tout nombre dépassant environ 2 milliards (10 chiffres) débordera, donnant des résultats sans signification. Il peut être être aussi étroit que 16 bits, ce qui lui donne une plage de seulement -32768 à +32767; vous ne devriez pas supposer que c'est nécessairement plus large que ça.

Si votre compilateur le supporte (et c'est probablement le cas), utilisez le type long long, qui est au moins 64 bits. C'est presque 19 chiffres décimaux, ce qui est plus que suffisant pour vos besoins.

+1

En outre, 'int' peut être aussi petit que 16 bits, donc -65,536 à 65,535 (dans une représentation de deux-complément). –

+1

@PeteBecker: Mise à jour. (BTW, c'est -32768 .. +32767.) –

+0

Je ne pense pas que vous croiriez que je ** vraiment ** signifiait un «int» de 17 bits? –