| 
	
		|  Autor | Tema: [RETO] Project Euler 4  (Leído 6,642 veces) |  
	| 
			| 
					
						| Psyke1 
								Wiki  Desconectado 
								Mensajes: 1.089
								
								     | 
 
Un número palíndromo es aquel que se lee igual si lo damos la vuelta, ejemplos: El palíndromo más grande de la multiplicación de dos números de dos cifras es: ¿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: 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:  Reto original: http://projecteuler.net/problem=4DoEvents!  
 
 |  
						| 
								|  |  
								| « Última modificación:  3 Febrero 2013, 16:21 pm por Psyke1 » |  En línea | 
 
 |  |  |  | 
			| 
					
						| Karcrack 
								       
								
								 Desconectado 
								Mensajes: 2.416
								
								 
								Se siente observado ¬¬'
								
								
								
								
								
								   | 
 
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: N = 100000x + 10000y + 1000z + 100z + 10y + xSi simplificamos la igualdad: N = 100001x + 10010y + 1100zN = 11*(9091x + 910y + 100z)
 
Así pues uno de los factores debe ser múltiplo de 11  
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Psyke1 
								Wiki  Desconectado 
								Mensajes: 1.089
								
								     | 
 
Tengo problemas de Overflow .    Mirad lo que hago: Option Explicit Private Sub Form_Load()Dim B As Double     B = 998001 '999 * 999    B = 999 * 999End Sub
 Me dice Overflow  en la multiplicación, pero la variable B  puede almacenar el resultado.   @karcrack : brillante deducción.   DoEvents!   |  
						| 
								|  |  
								| « Última modificación:  2 Febrero 2013, 21:20 pm por Psyke1 » |  En línea | 
 
 |  |  |  | 
			| 
					
						| LeandroA | 
 
es porque vb lo declara como un integer     MsgBox VarType(999)MsgBox vbInteger
 B = 999# * 999#
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| BlackZeroX 
								Wiki  Desconectado 
								Mensajes: 3.158
								
								 
								I'Love...!¡.
								
								
								
								
								
								     | 
 
El domingo que vuelva lo mejoro nos vemos.  9009          91            99 906609        913           993
 91800819      9181          9999
 9028118209    91001         99209
 903231132309                910129        992421
 90189288298109              9100009       9910901
 
Aquí se las dejo: Option Explicit Private Sub Form_Load()    ' Es exponencialmente lento  el calculo.    MsgBox PE4_BlackZeroX(2)    MsgBox PE4_BlackZeroX(3)    MsgBox PE4_BlackZeroX(4)    MsgBox PE4_BlackZeroX(5)    MsgBox PE4_BlackZeroX(6)    MsgBox PE4_BlackZeroX(7) '--> Desde aqui se vuelve muy lento...    MsgBox PE4_BlackZeroX(8)    MsgBox PE4_BlackZeroX(9)    MsgBox PE4_BlackZeroX(10)    MsgBox PE4_BlackZeroX(11)End Sub Public Function PE4_BlackZeroX(Optional ByVal bCifras As Byte = 3) As DoubleDim Value       As DoubleDim Low         As LongDim High        As LongDim LowLimit    As LongDim HighLimit   As LongDim i           As DoubleDim j           As Double     If (bCifras < 2) Then Exit Function     'Sabiendo que 91 * 99 = 9009 de igual manera sabiendo que solo agregar 2 numeros X (suponiendo 0)    'en el centro, pero en sus laterales siempre habra 9 es de esperar que la multiplicación:    '10 * (91 * 99) se acerque a 900009 pero JAMAS será esacta, aun que estos Dos numeros se acercan    'a los dos numeros que multiplicados dan un numero Palindromo...     Low = 91 * 10 ^ (bCifras - 2)    LowLimit = Low + 10 ^ (bCifras - 2)    High = 99 * 10 ^ (bCifras - 2)    HighLimit = High + 10 ^ (bCifras - 2) - 1     For i = Low To LowLimit        For j = High To HighLimit            Value = (i * j)            If (isValid(Value, bCifras * 2)) Then                PE4_BlackZeroX = Value                Exit Function            End If        Next    Next     PE4_BlackZeroX = -1 End Function Public Function isValid(ByVal Natural As Double, ByVal lenght As Long) As BooleanDim High        As LongDim Low         As LongDim Fraction    As DoubleDim Pow         As Double     Pow = (10 ^ (lenght - 1))     Do While (Natural > 0) And (Pow > 0)        High = Fix(Natural / Pow)        Fraction = Natural / &HA&        Natural = Fix(Fraction)        Low = (Fraction - Natural) * &HA&         If Not (Low = High) Then            isValid = False            Exit Function        End If        Pow = (Pow / &HA&)        Natural = Natural - (High * Pow)        Pow = (Pow / &HA&)    Loop     isValid = True End Function 
 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 
								Mensajes: 1.089
								
								     | 
 
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.   DoEvents!   |  
						| 
								|  |  
								| « Última modificación:  3 Febrero 2013, 11:12 am por Psyke1 » |  En línea | 
 
 |  |  |  | 
			| 
					
						| DarkMatrix 
								
								 Desconectado 
								Mensajes: 150
								
								 
								Nuestro Limite es la Imaginacion
								
								
								
								
								
								     | 
 
Bueno, a partir de 9 cifras se hace un poco lento el calculo asi que solo calcule hasta 8 cifras, aqui mi codigo: Public Function PE4_Dark(Optional ByVal lCifras As Long = 3) As Double     Dim A   As Double    Dim B   As Double    Dim Min As Double    Dim Max As Double    Dim Tmp As Double     If lCifras < 2 Then Exit Function     Min = 10 * (10 ^ (lCifras - 2)) * 9    Max = 10 * (10 ^ (lCifras - 1)) - 1     For A = Max To Min Step -2         For B = Max To Min Step -2             Tmp = A * B             If Tmp = InvNumber(Tmp) Then                 PE4_Dark = Tmp                 Exit Function             End If         Next B     Next A End Function Public Function InvNumber(ByVal Number As Double) As Double     Dim A As Double    Dim C As Integer     While Number > 0         A = (Number / 10)         Number = Int(A)         C = (A - Number) * 10         InvNumber = (InvNumber * 10) + C     Wend End Function
 Salidas: PE4_Dark(2) = ( 99 x 91 ) = 9.009PE4_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 
								Mensajes: 622
								
								 
								Im beyond the system
								
								
								
								
								
								   | 
 
vamos a participar... Contame, se le pueden pasar valores erroneos a la funcion... Digamos un numero negativo? 
 RUSTIC MODE OOOOOOOOON! Public Function PE4_eCode(Optional ByVal lCifras As Long = 3) As Double    Dim Nueves As Double    Dim Factor As Double    Dim i As Double    Dim y As Double    If lCifras < 1 Then Exit Function 'anti negativos.    Nueves = 10 * (10 ^ (lCifras - 1)) - 1    Factor = 9 * (10 ^ (lCifras - 1))    PE4_eCode = Nueves * Factor     For i = Nueves To 1 Step -2        If i Mod 11 = 0 Then 'Karcrack logic :D        For y = Nueves To Factor Step -2            PE4_eCode = i * y            If PE4_eCode = StrReverse(PE4_eCode) Then Exit Function        Next        End If    NextEnd 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 $$$Mis programasProgramo por $$$
 Hago tareas, trabajos para la facultad, lo que sea en VB6.0
 |  |  |  | 
			| 
					
						| Karcrack 
								       
								
								 Desconectado 
								Mensajes: 2.416
								
								 
								Se siente observado ¬¬'
								
								
								
								
								
								   | 
 
@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: Public Static Function PE4_Karcrack(Optional ByVal lCifras As Long = 3) As Double    Dim A   As Double    Dim B   As Long    Dim C   As Long    Dim D   As Long    Dim M   As Long    Dim R   As Double     B = (10 ^ lCifras) - 1    M = (10 ^ (lCifras - 1))     Do Until (M Mod 11) = 0        M = M + 1    Loop     D = B     Do Until (D Mod 11) = 0        D = D - 1    Loop     For A = D To M Step -11        For C = B To A * 0.8 Step -1            R = (A * C)            If R <= PE4_Karcrack Then Exit For            If R = NReverse(R) Then                PE4_Karcrack = R            End If        Next C    Next AEnd Function  Public Static Function NReverse(ByVal D As Double) As Double    Dim dig As Long    While D > 0        dig = (D - Fix(D / 10#) * 10)        NReverse = NReverse * 10 + dig        D = Fix(D / 10)    WendEnd Function
 Ejemplo: Salida:Private Sub Form_Load()    Dim i   As Long     For i = 2 To 5        Debug.Print i, PE4_Karcrack(i)    Next iEnd Sub
  2             9009
 3             906609
 4             99000099
 5             9966006699
 6             999000000999
Al parecer el NReverse() se queda en bucle infinito con 7 cifras   |  
						| 
								|  |  
								| « Última modificación:  3 Febrero 2013, 23:17 pm por Karcrack » |  En línea | 
 
 |  |  |  | 
			| 
					
						| BlackZeroX 
								Wiki  Desconectado 
								Mensajes: 3.158
								
								 
								I'Love...!¡.
								
								
								
								
								
								     | 
 
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. |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | Projecto Euler problema 12 Ejercicios
 | lDanny | 5 | 5,990 |  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 | 23,670 |  26 Enero 2013, 11:20 am por imoen
 |  
						|   |   | [RETO] Project Euler 2
							« 1 2 3 » Programación Visual Basic
 | Psyke1 | 23 | 11,988 |  25 Enero 2013, 23:19 pm por Danyfirex
 |  
						|   |   | [RETO] Project Euler 3
							« 1 2 » Programación Visual Basic
 | Psyke1 | 13 | 7,776 |  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 | 2,482 |  24 Agosto 2017, 04:09 am por engel lex
 |    |