1

How can I convert an Integer to list of numbers? For example:

781049 ==> {7, 8, 1, 0, 4, 9}

What are the possible ways of doing this? How well they compare performance-wise? Is a compiled version faster than IntegerDigits? How to convert huge amounts of large integers to digit form?

m_goldberg
  • 107,779
  • 16
  • 103
  • 257
oby
  • 19
  • 1

2 Answers2

5

This is pretty easy if you understood that we live in a world of base 10 and the principles of division with rest:

n = 781049;
Rest@Reverse[Flatten@Last@Reap@FixedPointList[(Sow[Mod[#, 10]]; Quotient[#, 10]) &, n]]
(* {7, 8, 1, 0, 4, 9} *)

or as J.M. suggested with one call to get the quotient and the remainder

With[{n = 781049}, Reverse[Reap[NestList[Block[{q, r}, 
 {q, r} = QuotientRemainder[#, 10]; Sow[r]; q] &, n, IntegerLength[n]]][[-1, 1]]]]

If you really prefer shorter methods, than you could go with

IntegerDigits[n]

or maybe

ToExpression@StringCases[ToString[n], DigitCharacter]

if you like strings. Without giving explicit timings you can safely assume, that every function will be slower than IntegerDigits.

halirutan
  • 112,764
  • 7
  • 263
  • 474
4
f[n_ /; n < 10] := {n};
f[n_] := f[Floor[n/10]]~Join~{n~Mod~10};

f[n0_] := Block[{n = n0, r = {}},
  While[n != 0,
   r = {n~Mod~10}~Join~r;
   n = Floor[n/10]];
  r
 ]

f /@ {123, 142857, 9876}
(*{{1, 2, 3}, {1, 4, 2, 8, 5, 7}, {9, 8, 7, 6}}*)
chyanog
  • 15,542
  • 3
  • 40
  • 78