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

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

11
задан ronT 1 September 2010 в 00:05
поделиться

6 ответов

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

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;
}

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

10
ответ дан 3 December 2019 в 03:51
поделиться

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

В псевдо-C:

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

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

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

7
ответ дан 3 December 2019 в 03:51
поделиться

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

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;
}

Другие «трюки» обычно включают преобразование строк. Вот однострочник C# с использованием Linq, который даст тот же результат, что и выше:

var digits = number.ToString().Select(c=>byte.Parse(c)).ToList();
4
ответ дан 3 December 2019 в 03:51
поделиться

Код 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))
3
ответ дан 3 December 2019 в 03:51
поделиться

Более эффективный алгоритм, если ваши входные числа могут быть большими, состоит в делении на степень из 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;
1
ответ дан 3 December 2019 в 03:51
поделиться

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

1
ответ дан 3 December 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: