web-dev-qa-db-fra.com

Comment gérer des nombres importants?

Eh bien, je viens de commencer à faire des énigmes et il est tellement gênant de voir des énigmes faciles à faire, mais il est également nécessaire de gérer de très grands nombres. C'est le problème.

Dis que je dois faire face à des chiffres comme 10 ^ 6/2147483647/etc. Besoin de faire des opérations arithmétiques sur!

Cependant, je pense que celles-ci ne devraient pas être traitées de manière brutale, mais les théorèmes/déclarations mathématiques ne cliquent tout simplement pas dans mon esprit.

Comment pourrais-je gérer de telles puzzles (ne devrait pas utiliser External Lib)

7
0cool

Les grands nombres sont utilisés dans les défis du code car ils sont difficiles à gérer, c'est la même raison pour laquelle ils sont utilisés pour le cryptage. Il y a de grandes classes pour la plupart des langues pouvant aider à les rendre plus gérables. La plupart des défis du code peuvent être résolus tout en traitant de grandes numéros, il existe des solutions intelligentes qui trouvent des moyens d'éviter de devoir travailler avec de gros chiffres jusqu'à ce qu'il soit absolument nécessaire.

6
Ryathal

Bien que la solution exacte dépend du problème réel, il existe diverses approches que vous pouvez essayer de prendre avant de simplement calculer la force brute à l'aide d'un arbitraire ou multiple Math de précision Bibliothèque (Bigint, GMP, MPFR, ARPRAC, etc.).

Tout d'abord, utilisez des mathématiques. Les expressions peuvent-elles être simplifiées? Vous avez dit que la source de ces tâches implique des énigmes, donc je serais très enclin à examiner cette approche pour une solution, car cela pourrait être un facteur dans les puzzles ' aha moment. Les équations avec des facteurs facteurs, telles que probabilités binomiales peuvent généralement être simplifiées ou calculées (indirectement) à l'aide de techniques mathématiques plutôt que de la force brute.

affacturage Les chiffres et l'annulation des facteurs communs seraient l'une des premières choses que j'essaierais, à la main si besoin d'être. A Calculatrice de précision multiple peut être utile.

Refadrerait la question ou ses valeurs dans une base différente (par exemple binaire, hexadécimale) ou une échelle de différence (par exemple, la base logarithmique 2, 10, ou E - naturel ) rendre les valeurs plus faciles à gérer? Un exemple d'échelle logarithmique est le Decibel , utilisé pour les niveaux RF et audio.

Utiliser des techniques non aussi communément enseignées aujourd'hui, mais bien connues parmi les programmeurs, les ingénieurs, les mathématiciens qui connaissent la règle de diapositive peuvent être utiles.

Selon la question, faire une approximation d'abord peut parfois vous amener Vers la bonne réponse en empêchant les Minutiae de vous distraire d'attaquer le problème de manière créative.

Pour votre exemple; Calculez une équation associée (approximative) mais simplifiée.

 \frac{10^6}{2147483647} ≅ \frac{1 * 10^6}{2 * 10^9} \frac{1 * 10^6}{2 * 10^9} = \frac{1}{2} * \frac{10^6}{10^9} \frac{1}{2} * \frac{10^6}{10^9} = 0.5 * 10^{-3} = 0.0005

qui est très proche de la réponse correcte ou exacte

Un autre "truc" est d'utiliser modulo (mod, %, modulo, a \bmod n) Qui est l'un de mes moyens préférés de réduire les nombres, donc si vous connaissez une algèbre abstraite de base, vous pouvez parfois travailler avec arithmétique modulaire .

C'est un guide hors du brassard, un guide très approximatif de la manière dont j'approcherais un "casse-tête" ou un problème de programmation impliquant des nombres importants.

4
mctylr

Chaque langage de programmation prend en charge l'utilisation de grands nombres: certains ont ce support directement dans la bibliothèque standard, d'autres ont des bibliothèques spéciales écrites à cette fin (même plusieurs).

Tant que vous allez bien avec des nombres entier, vous devriez rechercher quelque chose comme BigInteger qui est présent dans de nombreuses langues. Si vous avez besoin de chiffres réels, vous devez rechercher arbitraires arithmétiques de précision bibliothèques.

Voici quelques exemples:

1
Alexander Galkin

Si vous travaillez à travers un défi de puzzle et que les grands nombres commencent à se présenter, le défi ne trouve pas tant la réponse (comme d'autres que d'autres ont noté, des bibliothèques existent pour travailler avec des nombres importants), mais le défi consiste à développer votre propre bibliothèque pour travailler avec de grands nombres. Cela peut être assez difficile car vous allez généralement avoir à fractionner le nombre de nombres d'une manière ou d'une autre dans plusieurs espaces de mémoire différents. Pour les entiers, cela est assez simple, si le temps prend du temps à la recherche et à la mise en œuvre; Cependant, la prise en charge des valeurs de points flottants améliorera certainement vos compétences en mathématiques!

Pour vous aider à démarrer, les sites suivants ont un code open source que vous voudrez peut-être lire pour voir comment ils fonctionnent avec les numéros:

De plus, la page Wikipedia sur l'arithmétique arbitraire-précision peut vous envoyer également sur certaines directions intéressantes.

1
rjzii

Celles-ci ne sont vraiment pas particulièrement énormes. Votre exemple est bien dans la plage soutenue par un C 'non signé INT' ou "long" sur un compilateur X86 typique et des configurations de vanille de python prendra automatiquement en charge l'arithmétique de précision arbitraire. Une partie de votre problème Peut-être que dans Python "^" n'est pas l'opérateur de l'exponenciation, c'est l'opérateur "XOR" du Bitwise. Essayez d'utiliser 10 ** 6 à la place. Bien sûr, en utilisant une division entière la réponse sera nulle . Voulez-vous plutôt une division de points flottante?

0
Charles E. Grant