10
votes

Comment trouver 2 à la puissance de n. n gammes de 0 à 200

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?


7 commentaires

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.


9 Réponses :


7
votes

Il suffit d'attendre un compilateur de 256 bits, puis utilisez int : -)

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 .


Vous le feriez avec un morceau de code comme (non testé): xxx


vous pourrait 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.

Si vous DO 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é: xxx

xxx

xxx

xxx

xxx

et sa sortie associée: xxx


3 commentaires

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 .



0
votes

si non signé long int 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):

non signé long int x = (1l << n); // n = 0..63


2 commentaires

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/... :-)



6
votes

Ça fait des âges depuis que j'ai utilisé Java au sérieux, mais: BigInteger classe? Il a tous les mathématiques habituels ( multiplier , pow ) et bit bit ( shiftleft ).

Votre marquage est un peu déroutant cependant, quelle langue avez-vous préféré?


2 commentaires

+1 avec BigInteger c'est une ligne de code: Java.sun.com/j2se/1.4.2/docs/api/java/math/...


pow est inutile; shiftleft est suffisant. Voir ma réponse.



1
votes

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.

Cependant, pour Java, vous avez un moyen de sortir, BigInteger


0 commentaires

5
votes

Utilisez java.math.biginteger.shiftleftft . xxx

extrait de sortie : xxx

si BigInteger est indisponible, vous pouvez aussi simplement faire la multiplication et le stocker dans un chaîne . xxx

( Voir Sortie complète )


4 commentaires

Au lieu de la gauche-shifting biginteger.one 'i' fois dans chaque itération, est-il plus efficace de démarrer avec une copie de BigInteger.one 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 Shifting 1 bit k peut en fait être moins cher que Shifting k-1 bits (dont la plupart sont des zéros) 1 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



6
votes

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


1 commentaires

@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 ...



14
votes

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


9 commentaires

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 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 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.



1
votes

Utiliser schéma!

1 => (expt 2 200)
1606938044258990275541962092341162602522202993782792835301376


0 commentaires

0
votes

in kotlin: xxx


1 commentaires

Bienvenue sur Stackoverflow. S'il vous plaît expliquer votre solution.