循环使长度为 25 的所有基数 6 数字(不包括 0)

  • 本文关键字:数字 不包括 循环 vb.net
  • 更新时间 :
  • 英文 :


我需要循环获取游戏的所有可能解决方案并暴力破解它。我需要获取所有长度为 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 位密钥进行暴力加密的任务,也就是说,可行但非常非常冗长。 您肯定会想研究一些树木修剪技术。

并利用这里存在的令人尴尬的并行性。

最新更新