Esta es la tercera versión... mejore el tiempo pero que alguien compruebe compilado!¡.
Tiempo 7913 930.892 msec
Resultado 7913 233168
Tiempo dany 1,693.349 msec
Resultado dany 233168
Tiempo Spyke1 521.769 msec
Resultado Spyke1 233168
Tiempo BlackZeroX V1 234.119 msec
Resultado BlackZeroX V1 233168
Tiempo BlackZeroX V2 130.859 msec
Resultado BlackZeroX V2 233168
Tiempo BlackZeroX V3 6.550 msec
Resultado BlackZeroX V3 233168
Tiempo MCKSys Argentina 10.054 msec
Resultado MCKSys Argentina 233168
Public Function mul3and5_Ver3(Optional ByVal dwBelowTo As Long = &H3E8&) As Long
Dim N As Long
Dim M As Long
Dim I As Long
If (dwBelowTo < &H4) Then Exit Function
dwBelowTo = (dwBelowTo - &H1)
N = dwBelowTo \ &H3
M = dwBelowTo \ &H5
I = M \ &H3
mul3and5_Ver3 = (&H3 * N * (N + &H1) \ &H2) + (&H5 * ((M * (M + &H1) \ &H2) - &H3 * (I * (I + &H1) \ &H2)))
End Function
Les dejo mi Análisis que anduve asiendo en el Block de Notas... Algo similar hice en las versiones anteriores.
Lo que trato de obtener son simples formulas de series numéricas bajo patrones...
/*
01 02 03 04 05 06 07 08 09 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
Cantidad múltiplos de 3 = 10 <--- Tomamos TODOS los múltiplos de 3 (3, 6, 9, 12, 15, 18, 21, 24, 27, 30, ...)
01 02 04 05 07 08 10
11 13 14 16 17 19 20
22 23 25 26 28 29
Cantidad múltiplos de 5 = 6
Removiendo múltiplos de 3 que se repitan en los de 5 = 4 múltiplos de 5 son los que quedan.
Se recurre en un patrón de 2 múltiplos de 5 y el siguiente se excluye por que será múltiplo de 3 como se ve en los números anteriores ( 5, 10, 20, 25, 35, 40, ...).
Por lo tanto Para 30
=1(3) + 2(3) + 3(3) + 4(3) + 5(3) + 6(3) + 7(3) + 8(3) + 9(3) + 10(3)
=3 * (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10) <--- Se genera una sumatoria multiplicada por 3.
=3 * 10 * (10 + 1) \ 2
Por lo tanto:
z = Numero Máximo.
N = Z \ 3
= 3 * N * (N + 1) \ 2 <--- Formula trozo 1 Ok...
= 1(5) + 2(5) + 4(5) + 5(5)
= 5 * (1 + 2 + 4 + 5) <-- Casi se genera una sumatoria así que sumo 3 y resto 3 ( 3-3 = 0 ) esto no importa no afecta...
= 5 * (1 + 2 + 3 + 4 + 5 - 3) <-- Sumatoria que se le resta 3 y a su resultado se multiplica 5.
= 5 * (5 * (5 + 1) \ 2 - 3)
Por lo tanto:
z = Numero Máximo.
N = Z \ 5
= 5 * (N * (N + 1) \ 2 - 3 ) <-- Aun falta corroborar si no hay que multiplicar o dividir ese -3 por lo tanto Expando...
= 5 * (1 + 2 + 4 + 5 + 7 + 8 + 10 + 11)
= 5 * (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 - 3 - 6 - 9)
= 5 * (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 - 3(1 + 2 + 3)) <-- Si habia algo que hacerle a ese -3 se le multipplicaba por una sumatoria.
= 5 * (11 * (11 + 1) \ 2 - 3 ( 3 * (3 + 1) \ 2))
Por lo tanto:
z = Numero Máximo.
M = Z \ 5
I = M \ 3
= 5 * ((M * (M + 1) \ 2) - 3 ( I * (I + 1) \ 2)) <-- Formula trozo 2 Ok
Por lo tanto para calcular la sumatoria de los múltiplos de 3 y 5 es:
(3 * N * (N + 1) \ 2 + N) + (5 * ((M * (M + 1) \ 2) - 3 * (I * (I + 1) \ 2)))
Donde:
z = Numero Máximo.
N = Z \ 3
M = Z \ 5
I = M \ 3
Todas las divisiones son en ENTEROS "\"
*/
--> Edito
Me estoy dando cuenta que el código es SIMILAR pero no igual al de MCKSys Argentina (Saca una sumatoria hasta 15, en base a un análisis similar)... me di cuenta ya tarde...
Dulces Lunas!¡.