如何从数字中提取每个数字?

时间:2010-09-01 00:05:10

标签: math

这不是一个家庭作业问题。我能想到的是重复将数字除以10(直到数字小于10)并保持计数,但这样的事情是否有诀窍呢?

11 个答案:

答案 0 :(得分: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;
}

请注意,它仅适用于非负整数。

答案 1 :(得分:7)

为什么在已经有一种非常可靠的方法实现转换时呢? (因为它不是家庭作业)。

在伪C中:

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

现在你的数字char数组(字符串)应该由数字的每个数字组成。大多数其他脚本语言也包含sprintf函数。

如果您需要base 8或base 16或binary等,这将有效。只需使用不同的格式说明符。

答案 2 :(得分:4)

数学答案是修改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;
}

其他“技巧”通常涉及字符串转换。这是使用Linq的C#one-liner,它将提供与上面相同的结果:

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

答案 3 :(得分:3)

使用您的方法的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))

答案 4 :(得分:1)

如果是Integer,您可以将字符串表示转换为字符数组,然后将其转换为字节数组(0-9)

答案 5 :(得分:1)

一个更有效的算法,如果您的输入数字可能很大,则除以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;

答案 6 :(得分:0)

可以使用

进一步优化给定的python解决方案
zerostr = ord('0')
def digits(n): 
    return map(lambda x: ord(x)-zerostr, str(n))

实际上,int -> str转换可能已完全优化,为了获得数值,使用数字字符串的内在字符值会更好,在每个编码(包括EBCDIC)中都会给出数字值通过int减法而不是str解析。

答案 7 :(得分:0)

以下是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%。在Opera 12中,整数函数稍微快了大约10%。

答案 8 :(得分:0)

不确定我是否理解你想要的......

以下是否适合你?它是用C#编写的......

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

我希望我有所帮助。

答案 9 :(得分:0)

以下计划也可以。

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

答案 10 :(得分:0)

JavaScript的:

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