我需要循环获取游戏的所有可能解决方案并对其进行暴力破解。我需要获取所有 25 个字符长且仅包含数字 1 到 5 的字符串,有没有人有一种不需要 25 个 for 循环的简单方法来做到这一点?
问问题
93 次
2 回答
0
有没有人有一种不需要25个for循环的简单方法来做到这一点?
不确定成本,但使用 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()
这将通过跳过不适合的值来短路循环。每个字符串都写入一个文本文件。
于 2013-11-11T19:25:59.793 回答
0
递归是这类问题的理想选择。我会给你伪代码,然后你可以编写 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 位密钥进行暴力破解加密的任务,也就是说,可行但非常冗长。您肯定会想研究一些树木修剪技术。
并利用这里存在的令人尴尬的并行性。
于 2013-11-11T15:44:32.567 回答