1
$\begingroup$

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?

$\endgroup$
5

2 Answers 2

5
$\begingroup$

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.

$\endgroup$
1
  • $\begingroup$ It might be nice to add timings to this question, given that István Zachar emphasized this. (+1) $\endgroup$
    – Mr.Wizard
    Commented Apr 10, 2013 at 14:23
4
$\begingroup$
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}}*)
$\endgroup$
1
  • 1
    $\begingroup$ Floor[n/10] is better written as Quotient[n, 10]. $\endgroup$ Commented Apr 10, 2013 at 14:30

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.