elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [RETO] Project Euler 4
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [RETO] Project Euler 4  (Leído 5,628 veces)
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
[RETO] Project Euler 4
« en: 2 Febrero 2013, 17:22 pm »

Un número palíndromo es aquel que se lee igual si lo damos la vuelta, ejemplos:
Código:
98789
121
345543

El palíndromo más grande de la multiplicación de dos números de dos cifras es:
Código:
9009 = 91 X 99

¿Cuál sería el palíndromo más grande de la multiplicación de dos números de TRES cifras?



Normas del reto:

1.-NO es válido precargar valores.

2.-Estructura de la función:
Código
  1. Public Function PE4_Psyke1(Optional Byval lCifras As Long = 3) As Double

3.-La función debe de ser válida para todas las cifras que se le pasen por el argumento.

4.-El resultado correcto es:
Código:
906609

Reto original:
Código:
http://projecteuler.net/problem=4

DoEvents! :P


« Última modificación: 3 Febrero 2013, 16:21 pm por Psyke1 » En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Proyect Euler 4
« Respuesta #1 en: 2 Febrero 2013, 19:10 pm »

Para los que se quejan de que para ganar hay que ir a la universidad:
Un número resultado de una multiplicación de 3 cifras tendrá como máximo 6 cifras. Teniendo en cuenta que debe ser palíndromo serían 3 cifras diferentes:
Código:
N = 100000x + 10000y + 1000z + 100z + 10y + x
Si simplificamos la igualdad:
Código:
N = 100001x + 10010y + 1100z
N = 11*(9091x + 910y + 100z)

Así pues uno de los factores debe ser múltiplo de 11 ;)


En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [RETO] Proyect Euler 4
« Respuesta #2 en: 2 Febrero 2013, 20:45 pm »

Tengo problemas de Overflow:-\

Mirad lo que hago:

Código
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4. Dim B As Double
  5.  
  6.    B = 998001 '999 * 999
  7.    B = 999 * 999
  8. End Sub

Me dice Overflow en la multiplicación, pero la variable B puede almacenar el resultado. :huh:

@karcrack: brillante deducción. ;)

DoEvents! :P
« Última modificación: 2 Febrero 2013, 21:20 pm por Psyke1 » En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [RETO] Proyect Euler 4
« Respuesta #3 en: 2 Febrero 2013, 21:01 pm »

es porque vb lo declara como un integer

Código:
    MsgBox VarType(999)
    MsgBox vbInteger
    B = 999# * 999#
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Proyect Euler 4
« Respuesta #4 en: 2 Febrero 2013, 21:41 pm »

El domingo que vuelva lo mejoro nos vemos.

Código:
 9009          91            99
 906609        913           993
 91800819      9181          9999
 9028118209    91001         99209
 903231132309                910129        992421
 90189288298109              9100009       9910901

Aquí se las dejo:
Código
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4.    ' Es exponencialmente lento  el calculo.
  5.    MsgBox PE4_BlackZeroX(2)
  6.    MsgBox PE4_BlackZeroX(3)
  7.    MsgBox PE4_BlackZeroX(4)
  8.    MsgBox PE4_BlackZeroX(5)
  9.    MsgBox PE4_BlackZeroX(6)
  10.    MsgBox PE4_BlackZeroX(7) '--> Desde aqui se vuelve muy lento...
  11.    MsgBox PE4_BlackZeroX(8)
  12.    MsgBox PE4_BlackZeroX(9)
  13.    MsgBox PE4_BlackZeroX(10)
  14.    MsgBox PE4_BlackZeroX(11)
  15. End Sub
  16.  
  17. Public Function PE4_BlackZeroX(Optional ByVal bCifras As Byte = 3) As Double
  18. Dim Value       As Double
  19. Dim Low         As Long
  20. Dim High        As Long
  21. Dim LowLimit    As Long
  22. Dim HighLimit   As Long
  23. Dim i           As Double
  24. Dim j           As Double
  25.  
  26.    If (bCifras < 2) Then Exit Function
  27.  
  28.    'Sabiendo que 91 * 99 = 9009 de igual manera sabiendo que solo agregar 2 numeros X (suponiendo 0)
  29.    'en el centro, pero en sus laterales siempre habra 9 es de esperar que la multiplicación:
  30.    '10 * (91 * 99) se acerque a 900009 pero JAMAS será esacta, aun que estos Dos numeros se acercan
  31.    'a los dos numeros que multiplicados dan un numero Palindromo...
  32.  
  33.    Low = 91 * 10 ^ (bCifras - 2)
  34.    LowLimit = Low + 10 ^ (bCifras - 2)
  35.    High = 99 * 10 ^ (bCifras - 2)
  36.    HighLimit = High + 10 ^ (bCifras - 2) - 1
  37.  
  38.    For i = Low To LowLimit
  39.        For j = High To HighLimit
  40.            Value = (i * j)
  41.            If (isValid(Value, bCifras * 2)) Then
  42.                PE4_BlackZeroX = Value
  43.                Exit Function
  44.            End If
  45.        Next
  46.    Next
  47.  
  48.    PE4_BlackZeroX = -1
  49.  
  50. End Function
  51.  
  52. Public Function isValid(ByVal Natural As Double, ByVal lenght As Long) As Boolean
  53. Dim High        As Long
  54. Dim Low         As Long
  55. Dim Fraction    As Double
  56. Dim Pow         As Double
  57.  
  58.    Pow = (10 ^ (lenght - 1))
  59.  
  60.    Do While (Natural > 0) And (Pow > 0)
  61.        High = Fix(Natural / Pow)
  62.        Fraction = Natural / &HA&
  63.        Natural = Fix(Fraction)
  64.        Low = (Fraction - Natural) * &HA&
  65.  
  66.        If Not (Low = High) Then
  67.            isValid = False
  68.            Exit Function
  69.        End If
  70.        Pow = (Pow / &HA&)
  71.        Natural = Natural - (High * Pow)
  72.        Pow = (Pow / &HA&)
  73.    Loop
  74.  
  75.    isValid = True
  76.  
  77. End Function
  78.  

Dulces Lunas!¡.
« Última modificación: 2 Febrero 2013, 21:49 pm por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [RETO] Proyect Euler 4
« Respuesta #5 en: 3 Febrero 2013, 02:39 am »

Black, tu algoritmo está incompleto. Tu sacas el primer palíndromo que encuentra. Pero debe de ser el mayor posible.

PD: Mi ordenador echa humo de 6 en adelante. :xD

DoEvents! :P
« Última modificación: 3 Febrero 2013, 11:12 am por Psyke1 » En línea

DarkMatrix

Desconectado Desconectado

Mensajes: 150


Nuestro Limite es la Imaginacion


Ver Perfil WWW
Re: [RETO] Proyect Euler 4
« Respuesta #6 en: 3 Febrero 2013, 13:20 pm »

Bueno, a partir de 9 cifras se hace un poco lento el calculo asi que solo calcule hasta 8 cifras, aqui mi codigo:

Código
  1. Public Function PE4_Dark(Optional ByVal lCifras As Long = 3) As Double
  2.  
  3.    Dim A   As Double
  4.    Dim B   As Double
  5.    Dim Min As Double
  6.    Dim Max As Double
  7.    Dim Tmp As Double
  8.  
  9.    If lCifras < 2 Then Exit Function
  10.  
  11.    Min = 10 * (10 ^ (lCifras - 2)) * 9
  12.    Max = 10 * (10 ^ (lCifras - 1)) - 1
  13.  
  14.    For A = Max To Min Step -2
  15.  
  16.        For B = Max To Min Step -2
  17.  
  18.            Tmp = A * B
  19.  
  20.            If Tmp = InvNumber(Tmp) Then
  21.  
  22.                PE4_Dark = Tmp
  23.  
  24.                Exit Function
  25.  
  26.            End If
  27.  
  28.        Next B
  29.  
  30.    Next A
  31.  
  32. End Function
  33.  
  34. Public Function InvNumber(ByVal Number As Double) As Double
  35.  
  36.    Dim A As Double
  37.    Dim C As Integer
  38.  
  39.    While Number > 0
  40.  
  41.        A = (Number / 10)
  42.  
  43.        Number = Int(A)
  44.  
  45.        C = (A - Number) * 10
  46.  
  47.        InvNumber = (InvNumber * 10) + C
  48.  
  49.    Wend
  50.  
  51. End Function

Salidas:

Código:
PE4_Dark(2) = ( 99 x 91 ) = 9.009
PE4_Dark(3) = ( 993 x 913 ) = 906.609
PE4_Dark(4) = ( 9999 x 9901 ) = 99.000.099
PE4_Dark(5) = ( 99979 x 99681 ) = 9.966.006.699
PE4_Dark(6) = ( 999999 x 999001 ) = 999.000.000.999
PE4_Dark(7) = ( 9999979 x 9467731 ) = 94.677.111.177.649
PE4_Dark(8) = ( 99999999 x 90063991 ) = 9.006.399.009.936.009
« Última modificación: 3 Febrero 2013, 13:47 pm por DarkMatrix » En línea

Todo aquello que no se puede hacer, es lo que no intentamos hacer.
Projecto Ani-Dimension Digital Duel Masters (Juego de cartas masivo multijugador online hecho en Visual Basic 6.0)

Desing by DarkMatrix
Elemental Code


Desconectado Desconectado

Mensajes: 622


Im beyond the system


Ver Perfil
Re: [RETO] Project Euler 4
« Respuesta #7 en: 3 Febrero 2013, 17:59 pm »

vamos a participar...
Contame, se le pueden pasar valores erroneos a la funcion...
Digamos un numero negativo?



RUSTIC MODE OOOOOOOOON!

Código
  1. Public Function PE4_eCode(Optional ByVal lCifras As Long = 3) As Double
  2.    Dim Nueves As Double
  3.    Dim Factor As Double
  4.    Dim i As Double
  5.    Dim y As Double
  6.    If lCifras < 1 Then Exit Function 'anti negativos.
  7.    Nueves = 10 * (10 ^ (lCifras - 1)) - 1
  8.    Factor = 9 * (10 ^ (lCifras - 1))
  9.    PE4_eCode = Nueves * Factor
  10.  
  11.    For i = Nueves To 1 Step -2
  12.        If i Mod 11 = 0 Then 'Karcrack logic :D
  13.        For y = Nueves To Factor Step -2
  14.            PE4_eCode = i * y
  15.            If PE4_eCode = StrReverse(PE4_eCode) Then Exit Function
  16.        Next
  17.        End If
  18.    Next
  19. End Function

Se parece a la de DarkMatrix pero aplica la Karcrack Logic :)
« Última modificación: 3 Febrero 2013, 18:51 pm por Elemental Code » En línea

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Project Euler 4
« Respuesta #8 en: 3 Febrero 2013, 21:20 pm »

@DarkMatrix,@Elemental Code no funcionará vuestro código al dar la vuelta al número. eCode al pasarlo a Str el EXX que se genera con números grandes explota. DarkMatrix tienes que hacer Fix() para que funcione correctamente el código.


Aquí mi aproximación:
Código
  1. Public Static Function PE4_Karcrack(Optional ByVal lCifras As Long = 3) As Double
  2.    Dim A   As Double
  3.    Dim B   As Long
  4.    Dim C   As Long
  5.    Dim D   As Long
  6.    Dim M   As Long
  7.    Dim R   As Double
  8.  
  9.    B = (10 ^ lCifras) - 1
  10.    M = (10 ^ (lCifras - 1))
  11.  
  12.    Do Until (M Mod 11) = 0
  13.        M = M + 1
  14.    Loop
  15.  
  16.    D = B
  17.  
  18.    Do Until (D Mod 11) = 0
  19.        D = D - 1
  20.    Loop
  21.  
  22.    For A = D To M Step -11
  23.        For C = B To A * 0.8 Step -1
  24.            R = (A * C)
  25.            If R <= PE4_Karcrack Then Exit For
  26.            If R = NReverse(R) Then
  27.                PE4_Karcrack = R
  28.            End If
  29.        Next C
  30.    Next A
  31. End Function
  32.  
  33.  
  34. Public Static Function NReverse(ByVal D As Double) As Double
  35.    Dim dig As Long
  36.    While D > 0
  37.        dig = (D - Fix(D / 10#) * 10)
  38.        NReverse = NReverse * 10 + dig
  39.        D = Fix(D / 10)
  40.    Wend
  41. End Function

Ejemplo:
Código
  1. Private Sub Form_Load()
  2.    Dim i   As Long
  3.  
  4.    For i = 2 To 5
  5.        Debug.Print i, PE4_Karcrack(i)
  6.    Next i
  7. End Sub

Salida:
Código:

  2             9009
 3             906609
 4             99000099
 5             9966006699
 6             999000000999

Al parecer el NReverse() se queda en bucle infinito con 7 cifras :laugh:
« Última modificación: 3 Febrero 2013, 23:17 pm por Karcrack » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Project Euler 4
« Respuesta #9 en: 4 Febrero 2013, 03:05 am »

Black, tu algoritmo está incompleto. Tu sacas el primer palíndromo que encuentra. Pero debe de ser el mayor posible.

Por lo menos cumple para 3 cifras.

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Projecto Euler problema 12
Ejercicios
lDanny 5 5,158 Último mensaje 16 Octubre 2010, 04:33 am
por [L]ord [R]NA
[RETO] Project Euler 1 « 1 2 3 4 5 »
Programación Visual Basic
Psyke1 42 19,804 Último mensaje 26 Enero 2013, 11:20 am
por imoen
[RETO] Project Euler 2 « 1 2 3 »
Programación Visual Basic
Psyke1 23 9,943 Último mensaje 25 Enero 2013, 23:19 pm
por Danyfirex
[RETO] Project Euler 3 « 1 2 »
Programación Visual Basic
Psyke1 13 6,382 Último mensaje 3 Febrero 2013, 20:45 pm
por imoen
Ayuda con el calculo de Pi por la Serie de Euler
Programación C/C++
Rollingman216 3 1,971 Último mensaje 24 Agosto 2017, 04:09 am
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines