2009-10-09 14 views
6

J'essaie de calculer 2^1000 (2 à la puissance de 1000) en utilisant C#. J'ai besoin de la valeur à tous les endroits. Je me gratte la tête depuis un moment maintenant parce que je n'arrive pas à trouver un moyen d'y parvenir en C#.Calcul de très grands nombres entiers

Y a-t-il un type de type qui va stocker un nombre de 300 chiffres et plus, qui me manque? :)

Merci

+4

Travaillez-vous sur les problèmes euler? Le coup est peut-être que vous n'avez pas besoin de toute la vaule de 2^1000. Notez simplement ce qui est utile (par exemple les 20 chiffres inférieurs) – pierrotlefou

+0

@pierr, oui c'était pour un problème d'Euler en fait! J'avais cependant besoin de tous les chiffres pour ce problème. – Mike

+1

Je n'ai pas travaillé sur une grande partie du projet Euler, mais d'après ce que j'ai vu, il semble que vous ayez à faire de grosses tâches comme ça, donc vous devez trouver un raccourci vers la solution. Mais oui, toute bibliothèque de "précision arbitraire" et/ou de "grand nombre entier" devrait gérer cela pour vous. –

Répondre

18

Oui, mais seulement dans .NET 4,0 à System.Numerics.BigInteger.

Si vous pouvez utiliser .NET 4.0, j'irais pour ça. Sinon, je suis sûr qu'il existe des bibliothèques tierces. Faites-moi savoir si vous voulez que j'essaie d'en trouver.

+0

Je vais voir s'il est possible d'utiliser .NET 4.0. Plutôt que d'une bibliothèque. Si c'est assez facile? – Mike

+0

On dirait que beaucoup d'autres personnes ont posté des liens vers des bibliothèques maintenant :) –

+0

Ils ont attendu la version 4.0 du framework pour l'inclure ??? en Java, il est là depuis JDK1.1 xD – fortran

4

System.Numerics.BigInteger si vous êtes en .net 4.0 (VS 2010)

Ou, cherchez une bonne mise en œuvre bigint sur le web - il y a beaucoup de choix.

Voir aussi this StackOverflow question.

1

Vous pouvez utiliser une matrice pour stocker vos chiffres. C'est compliqué, je sais, mais pour l'essentiel, vous devrez programmer la multiplication comme vous le feriez à la main, sauf dans votre code.

0

Il y a une classe appelée ici BigInt

Très utile pour ce type de problème sans .Net 4.0

0

eh ..., 2^0 est le premier bit, 2^1 est le deuxième bit, ..., 2^4 est le cinquième bit .... vous avez besoin de 1000 bits pour cela. Je ne sais rien à propos de C#, cependant, que diriez-vous juste de vous souvenir que la notation bit à bit est un 999 0 avec un 1? Et utilisez-le en conséquence.

Pour quoi envisagez-vous d'utiliser ce numéro?

1

Si vous pouvez utiliser IronRuby (pas sûr de la façon dont il est actuellement), il a une conversion implicite en Bignum. Exemple:

2 ** 1000 donne: 107150860718626732094842504906000181056140...

+0

Haha StackOverflow laisse juste le nombre aller loin de la page. Au moins, c'est à quoi ça ressemble sur mon navigateur (FF 3.5) – AlbertoPL

+0

Ouais, désolé pour ça. Va tronquer. –

0

Vous pouvez ajouter une référence à l'exécution Java (C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ vjslib.dll est ce que j'ai) et using java.math, vous obtenez un BigInteger

+3

Maintenant, il a deux problèmes, résoudre le problème et intégrer deux frameworks – Rodrigo

+0

Vous n'avez pas vraiment à faire face à la plupart des java, c'est juste une classe. Cela fonctionne aussi bien que toutes les autres classes de BigInteger. –

7

Si votre objectif est d'exercer vos compétences C# sur les problèmes d'Euler, alors l'utilisation d'une bibliothèque BigInt semble inutile. Si vous avez juste besoin de la valeur de 2^1000 pour résoudre un autre problème, eh bien, le voici.

10715086071862673209484250490600018105614048117055 
33607443750388370351051124936122493198378815695858 
12759467291755314682518714528569231404359845775746 
98574803934567774824230985421074605062371141877954 
18215304647498358194126739876755916554394607706291 
4571196477686542167660429831652624386837205668069376 
1

Je sais que cette question est assez ancienne mais elle est toujours trouvée par google. J'ai eu le même problème, je cherchais une bibliothèque à calculer avec des nombres énormes (ou petits) qui ne peuvent pas être représentés par des types de données standards. J'ai donc créé un nouveau type de données appelé EDecimal. Avec ce type de données, vous pouvez calculer avec des nombres de taille et de précision arbitraires. Peu importe si le nombre a 10 chiffres ou 1000000.

Juste un coup d'oeil à https://github.com/anakonda3000/HyperMath/

Questions connexes