¿Cuál es la forma más eficaz de concatenar dos enteros positivos en Mathematica 7?Concatenar dos enteros en Mathematica 7
cc[123, 4567]
>>1234567
¿Qué hay de más de dos?
cc[123, 4, 567, 89]
>>123456789
¿Cuál es la forma más eficaz de concatenar dos enteros positivos en Mathematica 7?Concatenar dos enteros en Mathematica 7
cc[123, 4567]
>>1234567
¿Qué hay de más de dos?
cc[123, 4, 567, 89]
>>123456789
Este será un poco más rápido para muchos enteros, que no sea su última solución:
ToExpression[StringJoin @@ Map[IntegerString, {##}]] &
Una alternativa más concisa es aceptar un solo argumento, suponiendo que sea una lista, en lugar de una secuencia, de números para concatenar:
[email protected]@[email protected]#&
que se basa en IntegerString
ser Listable
.
Esto sólo funciona correctamente para enteros cortos debido a que la salida debe ser tamaño de la máquina, pero es el más rápido que he encontrado:
Compile[{{a, _Integer}, {b, _Integer}},
b + a 10^Floor[1 + Log[10, b]]
]
Para enteros largos, el más rápido que pude encontrar es:
FromDigits[{##}, 10^[email protected]#2] &
para concatenar muchos enteros, lo siguiente fue más rápido que Fold
por una arriba:
FromDigits[Join @@ IntegerDigits[{##}]] &
En mis tiempos el uso de 'IntegerLength [b]' en la función compilada es 20 veces más rápido que el uso de 'Floor [...]'. –
@Sjoerd, ¿eso es en la versión 8? –
@ Mr.Wizard 'Fold' es lento porque termina multiplicando enteros pequeños por grandes para arreglos largos. Puede obtener un factor de 2 aceleración usando dividir y conquistar: 'Borrar [cc4]; cc4 [{i_}]: = i; cc4 [{i1_, i2_}]: = FromDigits [{i1, i2}, 10^IntegerLength [i2]]; cc4 [x_List]: = Con [{k = Cociente [Longitud [x] + 1, 2]}, cc4 [{cc4 [Take [x, k]], cc4 [Drop [x, k]]}]] ' . – Sasha