我能想到的就是反复将数字除以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);
number
是一个数字,因此有用于此目的的函数div
和mod
。 - Bart数学上的解决方法是对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();
使用您的方法编写的 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))
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;
JavaScript:
function digits(num) {
return String(num).split('').map(v => +v);
}
不确定我是否正确理解您想要的内容...
以下内容适合您吗?它是用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;
}
希望我能够帮到你。
给定的Python解决方案可以进一步优化,使用
zerostr = ord('0')
def digits(n):
return map(lambda x: ord(x)-zerostr, str(n))
int -> str
转换方面可能已经完全优化了,为了获得数字值,更好的方法是使用数字字符串的内在字符值,这在每种编码(包括 EBCDIC)中都通过 int
减法而不是 str
解析来给出数字值。以下是处理整数或字符串的 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;
}
一旦你将数字作为数组获取,你可以轻松地反转数组以从左侧或右侧开始获取数字。
字符串函数更加灵活多变,因为它可以在字符串中查找任何数字,而整数函数仅限于整数。
Benchmarks: http://jsperf.com/todigitsarray
两个函数之间的基准测试显示,在Firefox 10和Chrome 12中,字符串函数比整数函数快30%至60%。而在Opera 12中,整数函数略微快约10%。
sprintf
或snprintf
),然后再将字符值用atoi
函数转换成数字。这种方法不使用模运算或者据我所知的除法操作。 - MrMesees