2010-09-01 71 views
11

这不是一个家庭作业问题。我所能想到的就是重复将数字除以10(直到数字少于10)并保持计数,但是这种排序有什么用?如何从数字中提取每个数字?

+1

啊,这是正确的解决方案。你是什​​么意思? – 2010-09-01 00:10:53

+0

作为一个邪恶的把戏,我转换为一个字符串('sprintf'或'snprintf'),然后'atoi'的char值,所以我可以得到这个数字。它不使用模数或AFAIK除法操作。 – MrMesees 2017-07-02 15:10:24

回答

1

如果它是一个整数,你可以将字符串表示转换成字符数组,并再转化字节数组(0-9)

+0

我认为把它转换成一个字符串表示本质上会重复10次分隔。至少,这就是我将要做的事情。 – 2010-09-01 01:06:57

+0

如果它在十六进制中,该怎么办? – munmunbb 2017-02-12 05:15:10

+0

整数是一个整数,它以相同的方式存储在内存中,无论您是否看到它以十进制,十六进制,二进制或其他形式显示。你问如何提取十六进制*表示*中的单个字符?如果是这样,只需将十六进制表示形式作为字符串,然后取出该字符串中的字符。 – 2017-02-12 05:33:10

9

是的,你几乎必须的数学方法来在那里做。

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

请注意,它仅适用于非负整数。用你的方法

3

Python代码:

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

使用convertation串:

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

为什么自己实现转换时,已经是一个非常可靠的方式做到这一点? (因为它不是家庭作业)。

在伪C:

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

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

这将工作,如果你想要基地8或基地16或二进制等只使用不同的格式说明符。

+0

但不能推广到16,10或8以外的碱基。(二进制没有标准版sprintf的“%”说明符) – 2010-09-01 00:25:56

+0

然后,如果你想用它们作为实际数字,你必须从它们中减去“0”。至于为什么...也许你正在做一些娱乐性的计算数学问题,并且你不想要那些额外的开销。我敢肯定,使用数字的数字有项目欧拉问题! – Cascabel 2010-09-01 00:32:34

+0

我讨厌这个转换为字符串。我会尽快把这个打下来。我只是觉得这是非常糟糕的解决方案。 – Bart 2010-09-02 07:00:38

4

数学答案是mod 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#的一行,将给予相同的结果上面:

var digits = number.ToString().Select(c=>byte.Parse(c)).ToList(); 
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; 
+0

modding对于任何数字N都是有效的log(n)操作。即使对于大数目,它也没有得到更高的效率。 – KeithS 2012-02-02 17:23:38

+1

@KeithS:渐近地,二元分裂 - 只要你使用快速分割(FFT或甚至Karatsuba),减少数字mod 10^k的k值约为log_100 N(对于输入N)。实际上,减少mod最小功率的十倍小于匹配在一个单词中的最大整数的平方根与减少mod 10一样快,所以在64位机器上你可以获得大约9倍的加速比。一旦达到某个阈值,您就可以将这两种方法结合起来,从渐近方法转为实用方法。根据我的经验,它大约有1000位数字,但它有所不同。 – Charles 2012-02-02 17:56:34

0

给定蟒溶液可以进一步优化使用

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

事实上,其中int -> str转换可能是完全优化的,要获得数值,使用数字串的内在字符值会更好,在每个编码(包括EBCDIC)中,都会使用int减法而不是str解析来提供数字值。

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和铬12,字符串函数比整数函数快30%至60%。在Opera 12中,整数函数略快10%左右。

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

我希望我是有帮助。

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

的JavaScript:

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