Jump to content
David.P

Calcular potências elevadas

Recommended Posts

David.P

Saúde, uso o seguinte código pra calcular potências:

            int n = textBox1.TextLength;
            double p = Convert.ToDouble(numericUpDown1.Value);
            int nums = Convert.ToInt32(Math.Pow(n, p));
 

Isto é pra calcular quantas combinaçons possíveis há dos caracteres introduzidos em "textBox1", "numericUpDown1" seria a longitude das combinaçons.

O problema é que para 36 caracteres e longitude 5 (36^5) dá como resultado 60.466.176, mas se lhe subimos a 6 a longitude (36^6) o resultado seria 2.176.782.336 e dá o seguinte erro:

http://img207.imageshack.us/img207/8037/potenciaz.jpg

O programa que uso é o SharpDevelop.

Graças a todos.

Share this post


Link to post
Share on other sites
mjamado

Tens que usar um tipo com mais bits. Um inteiro de 32 bits só te dá para 2^(32 - 1) = 2.147.483.648 (repara como é inferior ao resultado que pretendes). Se usares uint (32 bits sem sinal), dá-te para 4.294.967.296; se usares long (64 bits com sinal), dá-te para 9.223.372.036.854.775.808 e, finalmente, se usares ulong (64 bits sem sinal), dá-te para 18.446.744.073.709.551.616.

De qualquer das formas, 36^13 já te rebenta até com o ulong.

Uma solução é usar a estrutura BigInteger, disponível no namespace System.Numerics (apenas na .NET 4.0+). No entanto, tem em mente que o uso duma estrutura, em vez de um tipo primitivo, trará sérias penalidades de performance.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
pmg

O problema não é das potências

            int n = textBox1.TextLength;
            double p = Convert.ToDouble(numericUpDown1.Value);
            double tmp = Math.Pow(n, p);

mas sim da conversão

            int nums = Convert.ToInt32(tmp);

Usa double no resto dos cálculos ou muda o tipo de nums para outro com "range" maior.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
David.P

Feito  :cheesygrin:

É certo que com 36^13 já rebenta mas pra mim é suficiente.

int n = textBox1.TextLength;
double p = Convert.ToDouble(numericUpDown1.Value);
ulong nums = Convert.ToUInt64(Math.Pow(n, p));

Obrigado.

Share this post


Link to post
Share on other sites
David.P

Venho de descobrir como calcular qualquer potência, o problema é que tenho que convertir o valor a string e nom a int, polo que nom se pode usar tal valor como um número inteiro, eu usava-o pra dar-lhe valor a umha progressBar mas nom precisso de um valor tam grande. Mas pra saber numha messageBox qual sería o resultado vale isto:

int n = textBox1.TextLength;
double p = Convert.ToDouble(numericUpDown1.Value);
double nums = Math.Pow(n, p);
MessageBox.Show(Convert.ToString(nums));

Obrigado a todos mais umha vez.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.