在C#中获取整数的各个位数

9

当我需要从数字的各位数位计算出校验码/数字时,我遇到了这个挑战。

例如,我有一个数字(Int32):423594340,我想要一个包含整数4,2,3,5,9,4,3,0的集合。

我认为最好不要将给定的int转换为String,因为这会影响性能。那么你该怎么做呢?


2
你刚刚是同时发布问题和回答了吗? - Gilad Green
3
SO鼓励发布关于你自己解决问题的帖子(前提是它有用且不是已经存在的重复帖子)。 - Willem Van Onsem
1
@WillemVanOnsem - 同意这一点..但是从一个整数获取所有数字...这个问题已经被问了很多次。我记得最近一两周在某个地方看到过一个新的类似问题。 - Gilad Green
@GiladGreen 除了在同一时间提出问题并回答问题之外,还有其他方法可以发布一个好的解决方案 ;) - Mighty Badaboom
@MightyBadaboom,我真的没有找到另一个关于C#的问题。现在,我同意你的看法,并将其标记为重复。 - bvwidt
1个回答

16

我想出了一个个人难题解决方案。

#1: 自己创建的解决方案

public static IEnumerable<int> GetDigits(int source)
{
    int individualFactor = 0;
    int tennerFactor = Convert.ToInt32(Math.Pow(10, source.ToString().Length));
    do
    {
        source -= tennerFactor * individualFactor;
        tennerFactor /= 10;
        individualFactor = source / tennerFactor;

        yield return individualFactor;
    } while (tennerFactor > 1);
}

#2: 使用 Linq 的 .Reverse() 进行取模运算

在尝试了其他方法后,我在网上找到了来自Java社区的一个解决方案:如何获取int数字的各个数字?

缺点是,集合中的整数顺序被反转了。这时候就需要使用微软的Linq了。

使用.Reverse()方法调用该方法。

...
GetDigits2(input).Reverse()
...

实际的方法。

public static IEnumerable<int> GetDigits2(int source)
{
    while (source > 0)
    {
        var digit = source % 10;
        source /= 10;
        yield return digit;
    }
}

#3: 带LIFO栈的模数

当我在使用GetDigits2(int source)方法后不想再考虑调用.Reverse()方法时,我还能做什么呢?所以我在方法内部使用一个变量,在变量上调用了.Reverse()方法,并返回其结果。

或者完全不同的做法:我记得LIFO逻辑。在.NET中,您可以使用Stack类实现它。

public static IEnumerable<int> GetDigits3(int source)
{
    Stack<int> digits = new Stack<int>();
    while (source > 0)
    {
        var digit = source % 10;
        source /= 10;
        digits.Push(digit);
    }

    return digits;
}

测试

我对每种方法进行了1000万次测试,并测量了测试开始和结束之间的时间差。

#1:自己创建的方法

1'549'084 ticks

#2: 使用Linq的.Reverse()进行模数计算

2'252'875 ticks

#3:使用堆栈LIFO取模

23'626'839 ticks

简短概述:

这里有一个fiddle示例:从int中获取数字


发布一个你已经解决的问题,只是为了发布自己的答案以获取声望,这并不是很体育精神... - Mighty Badaboom
18
没问题,这句话的意思是“完全没问题”,它出现在stackoverflow.com网站上一个名为@MightyBadaboom的用户回答自己问题时。链接中的网页介绍了如何回答自己的问题。 - Equalsk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接