Это не домашнее задание. Все, что я могу придумать, - это многократно делить число на 10 (пока число не станет меньше 10) и вести счет, но есть ли хитрость для такого рода вещей?
Да, у вас есть математический способ сделать это прямо здесь.
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;
}
Обратите внимание, что это работает только для неотрицательных целых чисел.
Зачем выполнять преобразование самостоятельно, когда уже есть очень надежный способ сделать это? (И так как это не домашняя работа).
В псевдо-C:
char digits[10];
sprintf(digits, "%d", number);
Теперь ваш массив символов (строка) должен состоять из каждой цифры числа. Большинство других языков сценариев также содержат функцию sprintf.
Это сработает, если вы хотите использовать основание 8 или 16 или двоичный код и т. д. Просто используйте другой спецификатор формата.
Математический ответ состоит в том, чтобы изменить на 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();
Код 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))
Более эффективный алгоритм, если ваши входные числа могут быть большими, состоит в делении на степень из 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;
Если это целое число, вы можете преобразовать строковое представление в массив символов, а затем преобразовать его в массив байтов (0-9)