Supposons mon système sous forme de machine 32 bits. Compte tenu de cela si j'utilise longue int pour n> 63, je vais avoir ma valeur comme 0. Comment le résoudre? P>
9 Réponses :
Il suffit d'attendre un compilateur de 256 bits, puis utilisez Non, sérieusement, puisque vous voulez juste commencer par 1 et garder le doublement, votre meilleur pari est de obtenir une bibliothèque Big Integer comme MP GNU . P> Vous le feriez avec un morceau de code comme (non testé): p> vous pourrait em> code de votre propre structure de données d'un tableau de longs avec seulement deux opérations , double et imprimé mais je pense qu'il serait beaucoup plus facile de simplement utiliser GMP. P> Si vous DO EM> veux rouler le vôtre, jetez un coup d'œil à cela. C'est une variation / simplification de certaines bibliothèques de grandes entières que j'ai développées dans le passé: p> p> p> p> p> et sa sortie associée: p> int code>: -)
Si je veux utiliser ma propre structure de données, quelle est la procédure>
@mousey: Cela dépend vraiment de votre structure de données. Proposer une structure de données, et vous pourriez avoir quelques suggestions pour cela.
@mousey: Voir ma solution à l'aide de String code>.
si non signé long int code> est de 64 bits alors la valeur la plus importante pour 2 ^ n que vous pouvez représenter est 2 ^ 63 (I.e. N = 63): P>
non signé long int x = (1l << n); // n = 0..63 code> p>
En utilisant des chaînes ou des tableaux, nous pouvons représenter davantage.
Je crois que c'est ce dont vous avez besoin: Stackoverflow.com/Questtions/2643487/... :-)
Ça fait des âges depuis que j'ai utilisé Java au sérieux, mais: BigInteger classe? Il a tous les mathématiques habituels ( Votre marquage est un peu déroutant cependant, quelle langue avez-vous préféré? p> multiplier code>, pow code>) et bit bit ( shiftleft code>). P>
+1 avec BigInteger c'est une ligne de code: Java.sun.com/j2se/1.4.2/docs/api/java/math/...
pow code> est inutile; shiftleft code> est suffisant. Voir ma réponse.
en C / C ++ Je ne connais pas d'une manière standard, vous pouvez stocker des entiers que la solution de PAX est la solution de route. P>
Cependant, pour Java, vous avez un moyen de sortir, BigInteger p>
Utilisez extrait de sortie : p> si ( Voir Sortie complète ) p> p> java.math.biginteger.shiftleftft code> . BigInteger code> est indisponible, vous pouvez aussi simplement faire la multiplication et le stocker dans un chaîne code>. p>
Au lieu de la gauche-shifting biginteger.one code> 'i' fois dans chaque itération, est-il plus efficace de démarrer avec une copie de BigInteger.one code> et il est à gauche une fois par itération?
@Angry: J'allais pour la concision et la lisibilité sur les gains d'efficacité, mais je pense que pour BigInteger Code> Shifting 1 code> bit k code> peut en fait être moins cher que Shifting k-1 code> bits (dont la plupart sont des zéros) 1 code> heure.
Votre chemin est définitivement plus concis. Merci d'avoir souligné que dans ce contexte, il est également plus efficace. +1 :)
@Angry: Ne prenez pas simplement mes mots pour cela - regardez le repère! ideone.com/wirln
Python prend en charge les gros entiers hors de la boîte. À toute invite Linux, exécutez ceci:
$ python -c "for power in range(201): print power, 2**power" 0 1 1 2 2 4 3 8 4 16 5 32 6 64 <snip> 196 100433627766186892221372630771322662657637687111424552206336 197 200867255532373784442745261542645325315275374222849104412672 198 401734511064747568885490523085290650630550748445698208825344 199 803469022129495137770981046170581301261101496891396417650688 200 1606938044258990275541962092341162602522202993782792835301376
@Thorarin: Je n'ai rien vu spécifique à la langue dans la question. Je vois juste maintenant les tags avec C / C ++ / Java, mais cela implique qu'il ne se moque pas trop de quelle langue est utilisée. Peut-être que je déduit trop ...
double code> est parfaitement capable de stocker des pouvoirs de deux jusqu'à 1023 exactement fort>. Ne laissez pas quelqu'un vous dire que les numéros de points flottants sont toujours inexacts. Ceci est un cas particulier où ils ne sont pas! 2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
...
2^196 = 100433627766186892221372630771322662657637687111424552206336
2^197 = 200867255532373784442745261542645325315275374222849104412672
2^198 = 401734511064747568885490523085290650630550748445698208825344
2^199 = 803469022129495137770981046170581301261101496891396417650688
2^200 = 1606938044258990275541962092341162602522202993782792835301376
Comment allez-vous le seul à penser à cela? Comment les autres ont-ils eu autant de votes ??
Eh bien, ma solution se casse pour la plupart des autres bases, donc à cet égard, il est définitivement inférieur aux autres solutions publiées. De plus, beaucoup de gens ont peur des numéros de points flottants car ils ne comprennent pas leur représentation interne.
Great Catch, Fredoverflow. Puisque nous n'avons vraiment besoin que du bit le plus significatif et du nombre de zéros qui suivent, double code> fonctionne parfaitement ici.
Bien que le stockage interne du nombre soit complet et exact, je ne pense pas que la conversion en décimale pour l'impression soit garantie. Tu as de la chance.
Cela fonctionnera dans presque tous les cas, mais techniquement, la norme C ne spécifie pas la représentation interne des valeurs de points flottantes. Selon la mise en œuvre, vous pouvez toujours obtenir des erreurs de remontage. Sur les plates-formes communes, cela fonctionnera probablement.
@Thom Droite, je suppose qu'Eeee754 ici.
IEEE 754-1985 §5.6: "Lorsque l'entier ... 10 ^ 17 Pour le double, la mise en œuvre peut, à son option, modifier tous les chiffres significatifs après ... le dix-septième ... à d'autres chiffres décimaux, généralement 0." mais b> qui ne vous empêche pas de mettre en œuvre votre propre imprimante décimale parfaitement précise, la présume de conversion de chaîne est même pertinente pour le problème. (Telle viendrait vraiment cercle de cercle. Trouver des pouvoirs, cependant.)
@Potato mais il n'y a pas de chiffres significatifs après le 17ème ...?
@Fred: Désolé, je n'étais pas clair ... ce paragraphe parle de chiffres d'impression en décimal.
Utiliser schéma!
1 => (expt 2 200) 1606938044258990275541962092341162602522202993782792835301376
in kotlin:
Bienvenue sur Stackoverflow. S'il vous plaît expliquer votre solution.
Que voulez-vous faire avec ces valeurs?
calculer des pouvoirs de 2 à 200 ans;)
Pourquoi le système d'exploitation marqué est-il marqué?
Les gros chiffres ne vont pas dans une longue int. Vous aurez besoin d'un plus grand type de données.
Vous pouvez vérifier vos résultats contre wolframalpha.com/input/?i=2 ^ ^ 99 (remplacer au besoin)
2 ^ 200 = 160693804425899027554196209234116260252220299378279283530137 6
J'ai utilisé la calculatrice sur ma machine Linux, aucune idée de ce qu'elle a fait sous la hotte, mais de bien sûr, vous pouvez vérifier vos résultats comme celui-ci.