Я считаю, что это будет лучше, чем конвертировать туда и обратно.В отличие от ответа JBSnorro, я переворачиваюсь после преобразования в массив и поэтому избегаю IEnumerable
, что, я думаю, будет способствовать немного более быстрому коду.Этот метод работает для неотрицательных чисел, поэтому 0
вернет new int[1] { 0 }
.
Если он будет работать для отрицательных чисел, вы могли бы сделать n = Math.Abs(n)
, но я не думаю, что это имеет смысл.
Кроме того, если бы он был более производительным, я мог бы создать окончательный массив для начала, сделав комбинацию операторов if в виде бинарного поиска, чтобы определить количество цифр.
public static int[] digitArr(int n)
{
if (n == 0) return new int[1] { 0 };
var digits = new List<int>();
for (; n != 0; n /= 10)
digits.Add(n % 10);
var arr = digits.ToArray();
Array.Reverse(arr);
return arr;
}
Обновление 2018:
public static int numDigits(int n) {
if (n < 0) {
n = (n == Int32.MinValue) ? Int32.MaxValue : -n;
}
if (n < 10) return 1;
if (n < 100) return 2;
if (n < 1000) return 3;
if (n < 10000) return 4;
if (n < 100000) return 5;
if (n < 1000000) return 6;
if (n < 10000000) return 7;
if (n < 100000000) return 8;
if (n < 1000000000) return 9;
return 10;
}
public static int[] digitArr2(int n)
{
var result = new int[numDigits(n)];
for (int i = result.Length - 1; i >= 0; i--) {
result[i] = n % 10;
n /= 10;
}
return result;
}