-1

我需要循环获取游戏的所有可能解决方案并对其进行暴力破解。我需要获取所有 25 个字符长且仅包含数字 1 到 5 的字符串,有没有人有一种不需要 25 个 for 循环的简单方法来做到这一点?

4

2 回答 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 回答