Gente,
sou novo e estou aprendendo a programar em VBA. Estou tendo um erro (Estouro) no seguinte exercício:
Sub ex3()
Dim a As Long
Dim i As Long
Dim j As Long
Dim b As Long
Dim c As Long
a = 600851475143#
For i = 2 To 50
If a Mod i = 0 Then
b = i
j = 2
While (b Mod j <> 0)
j = j + 1
Wend
If (b = j) Then
c = b
End If
End If
Next
MsgBox c
End Sub
Se eu substituo o valor de a para um valor menor o programa funciona. O que devo fazer? Observar que chamei todas variáveis de long, pois até onde eu sei é o formato que mais cabe.
Obrigado gente, desculpa se tem alguma coisa semelhante.
Quando eu escrevo isso no código, ele automaticamente coloca um # no valor de a = 600851475143.
Esse exercicio faz parte do project euler https://projecteuler.net/ que apresenta um grande numero de problemas a serem resolvidos atraves da programação.
Esse meu codigo resolve, eu acredito, pois testei com outros valores, o maior numero primo divisor de algum numero dado. Porém para esse número gigantesco em questão eu tenho esse problema com o estouro.
Como resolvo, por favor, gente, me ajuda!
Bem, alterei as variáveis para double e agora o erro aparece na operação If a Mod i = 0 Then. O que devo fazer?
O tipo long tem uma restrição suportanto numeros um pouco maior do que 2 milhoes, como seu numero e maior (600 milhoes) gera o estouro
Experimente utilizar o descrito pelo colega Felipe Gualberto (Benzadeus) no seu site/tópico http://www.ambienteoffice.com.br/office ... _de_dados/
Declare o valor como Variante e utilize Cdec para conversão
Também a função mod deverá retornar como estouro, visto que retorna byte/integer/long.
Uma possível maneira
Sub ex3() Dim a As Currency Dim i As Currency Dim j As Currency Dim b As Currency Dim c As Currency a = 600851475143# For i = 2 To 50 'If a Mod i = 0 Then If (a / i) - Int(a / 1) = 0 Then b = i j = 2 While (b Mod j <> 0) j = j + 1 Wend If (b = j) Then c = b End If End If Next MsgBox c End Sub
Reinaldo
Muito obrigado, retirando a função mod o negócio vai. Valeu
Bom dia Edu
Seja bem-vindo ao fórum!
Se a resposta do Rim foi útil, clique na mãozinha que fica do lado da ferramenta Citar.
Se a resposta solucionou tua dúvida, clique no V ( que fica depois do botão X), para dar o tópico por Resolvido.
[]s
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
Bem,
eu ainda gostaria de explorar um pouco mais a resposta, pois o código alternativo funciona para certas situações, mas devido ao arredondamento das funções que substituem Mod e div () meu programa não esta fazendo as operações corretamente.
Vou refazer minha pergunta: existe alguma maneira de usar as funções mod e div para números muito grandes?
Obrigado
Para exemplificar estou fazendo esse programa que faz a multiplicação de números adjacentes e avalia qual é a maior delas (Observar que quando o numero de entrada a não e muito grande, o programa funciona corretamente e retorna a maior multiplicação de 4 números adjacentes) :
Sub lpias() a = 123456788484# i = 1 f = 4 'numero de digitos a serem multiplicado' While (i < a) i = i * 10 j = j + 1 Wend d = 1 For k = j To f Step -1 b1 = a Mod 10 ^ k b2 = b1 10 ^ (k - f) c = 1 c1 = b2 For p = 1 To f c = (c1 Mod 10) * c c1 = c1 10 Next 'condicao para que pegue a maior multiplicacao' If c > d Then d = c End If MsgBox d Next End Sub
Edu
Como vc é novo no fórum, te informo que clicando na mãozinha não vai fechar o tópico, apenas dar ponto de reputação para alguém que está te ajudando.
Você pode clicar na mãozinha em qualquer resposta que você achar útil, independente se o tópico for teu ou não.
Para encerrar o tópico, você terá que clicar no botão V.
[]s
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
edufranca, o vba e a função mod no vba, tem certa restrição;para números muito grande irá "falhar".
Não sou o mais indicado para isso, mas creio que uma alternativa é utilizar a combinação de divisão e inteiro, para "suprir" essa restrição.
Não testei, mas experimente:
Sub lpias() Dim b1 As Variant, b2 As Variant a = 123456788484# i = 1 f = 4 'numero de digitos a serem multiplicado' While (i < a) i = i * 10 j = j + 1 Wend d = 1 For k = j To f Step -1 'aqui mod retorna o resto da divisão 'assim tambem obtem o resto da divisão 0,...... b1 = a / 10 ^ k - Int(a / 10 ^ k) 'assim obtem somente a parte numeral depois da virgula aArray = Split(b1, ",") b1 = CDec(aArray(1)) b2 = Int(b1 / 10 ^ (k - f)) c = 1 c1 = b2 For p = 1 To f c = (c1 / 10 - Int(c1 / 10)) * c aArray = Split(c, ",") 'c = (c1 Mod 10) * c c = CDec(aArray(1)) c1 = c1 10 Next 'condicao para que pegue a maior multiplicacao' If c > d Then d = c End If MsgBox d Next End Sub
Reinaldo