Notifications
Clear all

Problema com estouro

9 Posts
3 Usuários
0 Reactions
1,823 Visualizações
(@edufranca)
Posts: 5
Active Member
Topic starter
 

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.

 
Postado : 17/10/2014 12:47 pm
(@edufranca)
Posts: 5
Active Member
Topic starter
 

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!

 
Postado : 17/10/2014 1:06 pm
(@edufranca)
Posts: 5
Active Member
Topic starter
 

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?

 
Postado : 17/10/2014 1:14 pm
Reinaldo
(@rlm)
Posts: 246
Estimable Member
 

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

 
Postado : 17/10/2014 1:48 pm
(@edufranca)
Posts: 5
Active Member
Topic starter
 

Muito obrigado, retirando a função mod o negócio vai. Valeu

 
Postado : 17/10/2014 2:52 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

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

 
Postado : 18/10/2014 5:36 am
(@edufranca)
Posts: 5
Active Member
Topic starter
 

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
 
Postado : 19/10/2014 12:37 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

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

 
Postado : 20/10/2014 8:31 am
Reinaldo
(@rlm)
Posts: 246
Estimable Member
 

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

 
Postado : 20/10/2014 8:38 am