2010-03-12 9 views

Répondre

16

Si le 100.227273 est juste une approximation et que vous voulez obtenir la meilleure approximation rationnelle, utilisez continued fractions.

Prenez 100.227273 comme exemple.

  1. Eloignez la partie entière (100). Vous obtenez maintenant 100,227273 = 100 + 0,227273.
  2. Inverser 0.227273 pour obtenir 4.39999 (4.4?).
  3. Répétez l'étape 1 jusqu'à ce que vous soyez satisfait de l'erreur.

Ainsi, vous obtenez

     1 
100.227273 = 100 + ————————— 
         1 
        4 + ————— 
          1 
         2 + — 
          2 

simplifier cette expression pour obtenir 2205/22.

+1

+ 1 pour avoir essayé de dépasser ce que le questionneur a demandé, ce qu'il essaie probablement de faire. –

+0

+1 pour les fractions continues. IIRC il y a un algorithme simple qui utilise seulement 3 variables d'état pour aller arbitrairement profond. – phkahler

12

1000000/gcd(1000000,227273). Également connu sous le numéro lcm(1000000,227273)/227273. Dans ce cas, 1 million.

Ce que vous voulez faire, c'est tourner 0,227273 en une fraction dans la forme la plus simple. Le nombre que vous cherchez est alors le dénominateur de cette fraction. Depuis 227273/1000000 est déjà dans la forme la plus simple, vous avez terminé. Mais si votre entrée était 100.075, alors 75/1000 n'est pas dans la forme la plus simple. La forme la plus simple est 3/40, donc la solution pour X est 40.

En optimisation, vous pouvez simplifier le calcul car vous savez que le dénominateur de départ est une puissance de 10, donc ses seuls facteurs premiers sont 2 et 5. Donc tout ce que vous devez rechercher dans le numérateur est la divisibilité par 2 et 5, ce qui est plus facile que l'algorithme d'Euclide. Bien sûr, si vous avez déjà une implémentation de gcd et/ou lcm, alors c'est plus d'efforts de votre part, pas moins.

Gardez à l'esprit lorsque vous obtenez le résultat, que les nombres à virgule flottante ne peuvent généralement pas représenter les fractions décimales avec précision. Donc, une fois que vous avez la réponse mathématiquement correcte, il ne vous donnera pas nécessairement une réponse entière lorsque vous faites une multiplication à virgule flottante. Le revers de la médaille est que, bien sûr, la question ne s'applique que s'il y a une expression décimale finie du nombre qui vous intéresse.

Si vous avez d'abord le nombre comme quotient, alors vous devez trouver directement le dénominateur de sa forme la plus simple, non en la convertissant en décimal et en la tronquant. Par exemple, pour résoudre ce problème pour le nombre "6 et un tiers", la réponse est 3, pas une puissance de 10. Si l'entrée est "la racine carrée de 2", il n'y a pas de solution pour X.

Eh bien, en fait, le plus petit entier X avec la propriété dont vous avez besoin est 0, mais je suppose que vous ne voulez pas dire que ;-)

+0

et OP signifie un nombre entier positif. –

+0

Bien sûr. Donner la réponse «juste mais erronée» est juste ma petite façon de souligner l'imprécision de la question. –

+0

Non, -10,000,000,000 est beaucoup plus petit que 0.;) – kennytm

1

Si votre valeur décimale positif D a n chiffres à droite de la virgule , alors D * 10^n est un entier et X = 10^n/gcf (10^n, D * 10^n) = lcm (10^n, D * 10^n) est le plus petit entier positif X.

+0

Sauf qu'il semble qu'il ne connaisse pas le nombre de chiffres avant la partie fractionnaire. –

1

Je suppose que l'entrée décimale r est un nombre rationnel positif r avec une représentation décimale de terminaison.

Soit d le nombre de chiffres après la virgule décimale (supposons que nous avons éliminé tous les zéros étrangers de la représentation décimale de r). Notez ensuite que 10^d * r est un nombre entier m. Laisser g = gcd(10^d, m). Alors 10^d/g * r = m/g est un nombre entier p. Laisser q = 10^d/g. Je prétends que q est le plus petit entier positif de ce type.

Questions connexes