Adicionando dígitos de grandes inteiros no PowerShell
-
03-07-2019 - |
Pergunta
Ao adicionar os dígitos de um número no PowerShell, tudo está bem com números inteiros que têm um comprimento -le 29.
$largeInteger = 11111111111111111111111111111 #29 digits sums correctly $sumDigits = 0 $largeInteger while ($largeInteger -ne 0) { $sumDigits += $largeInteger % 10 $largeInteger = [MATH]::Floor($largeInteger /10) } $sumDigits
As coisas ficam interessantes quando o comprimento do número -gt 29. No caso em que o comprimento é 30, a soma = 77.
Todas as idéias?
Solução
Você terá que instalar uma biblioteca bignum. Há alguns ponteiros aqui . Ou isso, ou usar uma plataforma que tem bignums construído em.
Outras dicas
Você tem um excesso voado dupla que está sendo tratado como um caso especial por PowerShell. Você pode tentar $largeInteger = [float]111111111111111111111111111111
. Você ainda vai perder alguma precisão usando um float.
Para obter mais informações, consulte float (C # Referência)
Alterar largeInteger de 29 1 de 30 1 do muda o tipo da variável de Decimal para Double. Use $ largeInteger.GetType () para ver isso.
A matemática no algoritmo não funciona tão bem em duplas. Executar as 2 linhas no circuito repetidamente sobre o pedido para ver os valores, em cada passo.
Uma vez largeInteger vai de decimal para o dobro, a aritmética não é preciso mais nada. É por isso que eu sugeri runnning as 2 linhas na linha de comando.
Aqui está a saída -
PS C:> $ largeInteger% [duplo] 10
8
PS C:> $ largeInteger% [duplo] 100
88
PS C:> $ largeInteger% [duplo] 1000000000000000000
1.11105501764518E + 17
PS C:> $ largeInteger% [duplo] 1000000000000000000000
1.11111105501765E + 20
PS C:> $ largeInteger% [duplo] 1000000000000000000000000000
1.11111111111104E + 26
PS C:> $ largeInteger% [duplo] 100000000000000000000000000000
1.11111111111111E + 28
PS C:> $ largeInteger% [duplo] 1000000000000000000000000000000
1.11111111111111E + 29
Você pode ver a distorção que ocorre devido à representação imprecisa interna da dupla que não pode ser representado com precisão em binário. Como o divisor aumenta a precisão da crescente restante também melhora.