【问题标题】:How To Split An Integer如何拆分整数
【发布时间】:2020-02-11 17:59:43
【问题描述】:

我正在尝试创建一个additive persistence 程序,其中用户输入一个数字,程序输出迭代总数(或附加持久性)。

我想对其进行编码,以便不使用字符串数据类型。
是否有任何内置函数或其他我可以使用的函数,以便我可以将一个大数字拆分为单独的数字?

注意事项:

  1. 我正在 VB.Net 的控制台应用程序中编码
  2. 我在编码方面相对较新

【问题讨论】:

标签: vb.net digits sum-of-digits


【解决方案1】:

要获取以 10 为底的数字的最后一位,您可以使用模运算符,称为 Mod,因此:

1234 Mod 10 = 4
32 Mod 10 = 2

等等。

当你有最后一个数字时,它本质上可以通过整数除法被砍掉:

1234 \ 10 = 123
32 \ 10 = 3

所以现在可以重复该过程以获得最后一位数字。一旦原始数字减为 0,算法就完成了。

由于您不需要任何特定顺序的数字,我们不必担心。

所以,给定:

Function GetDigits(n As Int64) As List(Of Int64)
    Dim digits As New List(Of Int64)
    While n > 0
        digits.Add(n Mod 10)
        n = n \ 10
    End While

    Return digits

End Function

你可以这样做:

Console.WriteLine(String.Join(" ", GetDigits(12345678900)))

获得以下输出:

0 0 9 8 7 6 5 4 3 2 1

我使用Int64(又名Long)作为GetDigits 的参数,这样您就可以使用比Int32(又名Integer)可以容纳的位数更多的数字。

由此,您可以:

Function AdditivePersistence(n As Int64) As Integer
    Dim pers = 0
    While n > 9
        pers += 1
        n = GetDigits(n).Sum()
    End While

    Return pers

End Function

【讨论】:

  • 如果您要返回一个数字列表,为什么这些是 Int64?鉴于唯一可能的值是 0-9,那么 List<Int16> 就足够了,并且可以更好地描述您返回的值。
  • @JonathanWillcock 它避免了digits.Add(Convert.ToInt32(n Mod 10)) 的额外转换步骤,并且几乎没有任何成本,因为 OP 不太可能担心内存使用情况。正如我所提到的,我使用了 Int64s,以便有更多的数字可供使用。当然,如果需要更多数字,可以将其更改为使用 System.Numerics 中的 BigInteger 类型。 Int16 充其量只会令人讨厌:Int16 - bytes capacity in.net?
  • @AndrewMorton 可以将相同的代码用于队列而不是列表吗?我问的唯一原因是我对列表不像对队列那样熟悉。队列会完成与代码中的列表相同的事情吗?
  • @FZCube42 与使用列表相比,我不确定队列是否会为解决方案添加任何内容。我添加了一个示例,说明如何使用该函数来帮助计算附加持久性;如您所见,很容易得到列表元素的总和。
  • @AndrewMorton 我已经设法使用队列将您的示例代码实现到我的程序中。我感谢您提供明确而有用的帮助。 :) -FZ
【解决方案2】:

您可以将 LINQ 与数学函数结合使用。

Function getSum(number As Integer) As Integer
    Return CInt(Enumerable.Range(0, CInt(Math.Round(Math.Log10(number), 0)) + 1).
                Select(Function(i) Math.Truncate(number / (10 ^ i)) Mod 10).Sum())
End Function
  • Enumerable.Range:创建从 0 到 log10 的整数。这是位数 - 1。
  • 选择:将数字除以(10 ^ 整数),去除小数,执行模 10 以仅得到个数。
  • 求和:对这些数字求和

把它放在一个函数的循环中,计算我们调用函数的次数,直到结果为

Function persistence(number As Integer) As Integer
    Dim count = 0
    Console.WriteLine($"Original Number: {number}")
    Do
        number = getSum(number)
        Console.WriteLine($"Number: {number}")
        count += 1
    Loop While number > 9
    Console.WriteLine($"Persistence: {count}")
    Return count
End Function
persistence(2718)

原始编号:2718
数量:18
数量:9
持久性:2

字符串更简单。尽管您说您不想使用字符串,但这里有一个解决方案。

Function getSum(number As Integer) As Integer
    Return number.ToString().Sum(Function(c) CInt(c.ToString()))
End Function
  • 将数字字符串中的单个字符转换为数字并将它们相加。

【讨论】:

  • @kiLLua 这不是我,但可能是因为有人注意到 OP 想要避免使用字符串。此外,似乎还有其他人最近也出现了,并对本问答中的所有内容都投了反对票。
猜你喜欢
  • 2011-11-22
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 2010-12-26
  • 2019-10-10
  • 2017-05-23
相关资源
最近更新 更多