Это не вопрос домашней работы. Все, о чем я могу думать, состоит в том, чтобы многократно делить число на 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);
}