2011-05-23 16 views

Respuesta

8

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.

3

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[{##}]] & 
+0

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 [...]'. –

+0

@Sjoerd, ¿eso es en la versión 8? –

+0

@ 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