如何拆分整数
How To Split An Integer
我正在尝试创建一个 additive persistence 程序,用户输入一个数字,程序输出迭代总数(或附加持久性)。
我想对其进行编码,以便不使用字符串数据类型。
是否有任何内置函数或其他我可以使用的函数,以便我可以将一个大数字拆分成单独的数字?
注意事项:
- 我正在 VB.Net
的控制台应用程序中编码
- 我在编码方面相对较新
要获取以 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
(a.k.a. Long
) 作为 GetDigits
的参数,这样您就可以使用比 [=19= 位数更多的数字] (a.k.a.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
您可以使用带有数学函数的 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.
- Select:将数字除以(10 ^ 整数),去除小数点,执行模 10 以得到那些部分。
- 求和:对这些数字求和
将它放在一个函数的循环中,该函数计算我们调用该函数的次数,直到结果小于 9
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)
Original Number: 2718
Number: 18
Number: 9
Persistence: 2
用字符串更简单。虽然你说你不想使用字符串,但这里有一个解决方案。
Function getSum(number As Integer) As Integer
Return number.ToString().Sum(Function(c) CInt(c.ToString()))
End Function
- 将数字字符串中的单个字符转换为数字并将它们相加。
我正在尝试创建一个 additive persistence 程序,用户输入一个数字,程序输出迭代总数(或附加持久性)。
我想对其进行编码,以便不使用字符串数据类型。
是否有任何内置函数或其他我可以使用的函数,以便我可以将一个大数字拆分成单独的数字?
注意事项:
- 我正在 VB.Net 的控制台应用程序中编码
- 我在编码方面相对较新
要获取以 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
(a.k.a. Long
) 作为 GetDigits
的参数,这样您就可以使用比 [=19= 位数更多的数字] (a.k.a.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
您可以使用带有数学函数的 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.
- Select:将数字除以(10 ^ 整数),去除小数点,执行模 10 以得到那些部分。
- 求和:对这些数字求和
将它放在一个函数的循环中,该函数计算我们调用该函数的次数,直到结果小于 9
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)
Original Number: 2718
Number: 18
Number: 9
Persistence: 2
用字符串更简单。虽然你说你不想使用字符串,但这里有一个解决方案。
Function getSum(number As Integer) As Integer
Return number.ToString().Sum(Function(c) CInt(c.ToString()))
End Function
- 将数字字符串中的单个字符转换为数字并将它们相加。