Как извлечь каждую цифру из числа?

Это не вопрос домашней работы. Все, о чем я могу думать, состоит в том, чтобы многократно делить число на 10 (пока число меньше 10) и сохранить счет, но есть ли трюк для этого вида?

Ответ 1

Да, у вас в значительной степени есть математический способ сделать это прямо там.

while (num >= 10)
    digit = num MOD 10   // and save this into an array or whatever
    num = num / 10

в конце этого, num будет содержать последнюю цифру.

Вот реализация Javascript:

function getDigits(num) {
    var digits = [];
    while (num >= 10) {
        digits.unshift(num % 10);
        num = Math.floor(num / 10);
    }
    digits.unshift(num);
    return digits;
}

Обратите внимание, что он работает только для неотрицательных целых чисел.

Ответ 2

Зачем внедрять преобразование самостоятельно, когда есть очень надежный способ сделать это? (И так как это не домашнее задание).

В псевдо-C:

char digits[10];
sprintf(digits, "%d", number);

Теперь ваши цифры char array (string) должны состоять из каждой цифры числа. Большинство других языков сценариев также содержат функцию sprintf.

Это будет работать, если вам нужна база 8 или базовая 16 или двоичная и т.д. Просто используйте другой формат.

Ответ 3

Математический ответ - мода на 10 и добавление каждого результата в список, а затем изменение порядка списка. Вот базовый алгоритм С#, который будет делать это:

List<byte> digits = new List<byte>();

while(number > 10)
{
   digits.Add(number % 10);
   number %= 10;
}
//add the last digit
digits.Add(number);

byte temp;
for(var i=0;i<digits.Count/2;i++)
{
   temp = digits[i];
   digits[i] = digits[digits.Count-(i+1)];
   digits[digits.Count-(i+1)] = temp;
}

Другие "трюки" обычно включают преобразование строк. Здесь однострочный С# с Linq, который даст тот же результат, что и выше:

var digits = number.ToString().Select(c=>byte.Parse(c)).ToList();

Ответ 4

Код Python с использованием вашего подхода:

def digits(n):
  ds = []
  while n > 0:
    ds.append(n % 10)
    n /= 10
  ds.reverse()
  return ds

Использование преобразования в строку:

def digits(n):           
  return map(int, str(n))

Ответ 5

Если это целое число, вы можете преобразовать строковое представление в массив символов, а затем преобразовать его в массив байтов (0-9)

Ответ 6

Более эффективный алгоритм, если ваши входные числа могут быть большими, состоит в том, чтобы разделить на мощность 10, скажем 1000, и использовать таблицу поиска:

s = ""; // or use a string builder appropriate to your language...
table = {"000", "001", ..., "999"};
tableInitial = {"unused", "1", "2", ..., "9", "10", ..., "999"};
while(n >= 1000) {
  m = n%1000;
  n /= 1000;
  s = table[m] + s;
}
s = tableInitial[n] + s;

Ответ 7

Данное решение python может быть дополнительно оптимизировано с помощью

zerostr = ord('0')
def digits(n): 
    return map(lambda x: ord(x)-zerostr, str(n))

Фактически, когда преобразование int -> str, вероятно, полностью оптимизировано, чтобы получить числовое значение, гораздо лучше использовать значение искомого символа цифровой строки, которое в каждой кодировке (включая EBCDIC) дает числовое значение посредством вычитания int вместо анализа str.

Ответ 8

Здесь обратимые функции массива в JavaScript, которые обрабатывают целые числа или строки:

function reverse(array)
{
    var left = null;
    var right = null;
    var length = array.length;
    for (left = 0, right = length - 1; left < right; left += 1, right -= 1)
    {
        var temporary = array[left];
        array[left] = array[right];
        array[right] = temporary;
    }
    return array;
}

function toDigitsArrayFromInteger(integer, isReverse)
{
    var digits = [];

    if (integer > 0)
    {
        var floor = window.Math.floor;
        while (integer > 0)
        {
            digits.push(floor(integer % 10));
            integer = floor(integer / 10);
        }

        // Array is populated in reverse order. Un-reverse it to make it normal.
        if (!isReverse)
        {
            digits = reverse(digits);
        }
    }
    else if (integer < 0)
    {
        digits = toDigitsArrayFromInteger(-integer, isReverse);
    }
    else if (integer === 0)
    {
        digits.push(0);
    }

    return digits;
}

function toDigitsArrayFromString(string, isReverse)
{
    var digits = [];

    string += ""; // Coerce to string.

    var i = null;
    var length = string.length;
    for (i = 0; i < length; i += 1)
    {
        var integer = parseInt(string.charAt(i), 10);
        if (isFinite(integer))
        {
            digits.push(integer);
        }
    }

    if (isReverse)
    {
        digits = reverse(digits);
    }

    return digits;
}

Когда у вас есть цифры в виде массива, вы можете легко изменить массив, чтобы получить цифры, начинающиеся слева или справа.

Строковая функция более универсальна, поскольку она может найти любую цифру в строке, тогда как целочисленная функция ограничена целыми числами.

Ориентиры: http://jsperf.com/todigitsarray

Тесты между двумя функциями показывают, что в Firefox 10 и Chrome 12 функция строки на 30% -60% быстрее, чем функция integer. В Opera 12 целочисленная функция немного быстрее примерно на 10%.

Ответ 9

Не уверен, правильно ли я понял, что вы хотите...

Будет ли ниже работа для вас? Он написан на С#...

public static List<int> ExtractDigit()
{
    // Input example
    int number = 12345;

    // Convert Integer to string   
    string numberedString = number.ToString();

    // Create a list of integers
    var numList = new List<int>();

    // Convert each character in string back to int and add to list.
    foreach (char c in numberedString)
    {
        numList.Add(Convert.ToInt32(c.ToString()));
    }

    return numList;
}

Надеюсь, я помог.

Ответ 10

Следующая программа также будет работать.

public class Main {
    public static void main(String[] args) {
        int i1 =123456;
        String s =new StringBuilder(String.valueOf(i1)).toString();
        char a[]=s.toCharArray();
        for(char c : a) {
            Integer i = Integer.parseInt(c+"");
            System.out.println(i);
        }
    }
}

Ответ 11

JavaScript:

function digits(num) {
  return String(num).split('').map(v => +v);
}