我需要循环获取游戏的所有可能解决方案并暴力破解它。我需要获取所有长度为 25 个字符且仅包含数字 1 到 5 的字符串,有没有人有一种不需要 25 for 循环的简单方法?
有没有人有一个简单的方法来做到这一点,不需要 25 循环?
不确定成本,但使用 BigInteger 类型意味着只需要一个循环:
Imports System.Numerics.BigInteger
Dim BadNums As String = "67890"
Dim sw As New IO.StreamWriter("AllNums.txt")
For I As Numerics.BigInteger = Numerics.BigInteger.Parse("1111111111111111111111111") To Numerics.BigInteger.Parse("5555555555555555555555555")
Dim temp As String = I.ToString
Dim index As Integer = temp.IndexOf("6"c)
If index < 0 Then
sw.WriteLine(temp)
Else
I += 5 * (Pow(10, 24 - index)) - 1
End If
Next
sw.Close()
这将通过跳过不适合的值来缩短循环。每个字符串都写入一个文本文件。
递归是这类问题的理想选择。 我会给你伪代码,然后你可以编写 VB.NET:
build_number( digit_array, current_digit)
is
if current_digit = digit_array.length
then
call use_number(digit_array)
else
loop digit_array[current_digit] from 1 to 5
call build_number(digit_array, current_digit + 1)
next
end
end
call build_number(new sbyte[25], 0)
请注意,实际使用System.String
来存储数字会创建大量的垃圾字符串。 使用数组或StringBuilder
要好得多。
然而,即使使用一种有效的方法来生成字符串,您的暴力破解方法在复杂性上也接近使用 64 位密钥进行暴力加密的任务,也就是说,可行但非常非常冗长。 您肯定会想研究一些树木修剪技术。
并利用这里存在的令人尴尬的并行性。