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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top