回 帖 发 新 帖 刷新版面

主题:[讨论]会的来,挑战高智商

我本人对编程一知半解
由于工作需要 现在要把57个字符串 其中任意5个字符串 按照不同的排列组合打印出来。。。汗
可想而知这工作量多么大。。望大虾们给予指导和帮助

醇酸铁红底漆 醇酸磁漆 醇酸系列 醇酸调和漆 醇酸防锈漆 醇酸清漆 醇酸铝粉漆 醇酸稀释剂
氨基磁漆 氨基底漆 氨基固化剂 氨基稀释剂 硝基磁漆 硝基底漆 硝基清漆 硝基稀释剂 
各色氨基平面锤纹漆 各色氨基立体锤纹漆 各色醇酸锤纹漆 丙烯酸清漆 丙烯酸外用磁漆 
丙烯酸底漆 丙烯酸马路划线漆 丙烯酸稀释剂 聚氨酯清漆 聚氨酯磁漆 聚氨酯底漆
聚氨酯稀释剂 丙烯酸聚氨酯清漆 丙烯酸聚氨酯外用清漆 丙烯酸聚氨酯半哑光清漆
丙烯酸聚氨酯外用半哑光清漆 丙烯酸聚氨酯磁漆 丙烯酸聚氨酯外用磁漆 丙烯酸聚氨酯底漆
丙烯酸聚氨酯稀释剂 各色氯化橡胶面漆 氯化橡胶底漆 氯化橡胶稀释剂 环氧底漆 
环氧富锌底漆 环氧云铁中层漆 环氧清漆 各色环氧磁漆 环氧稀释剂 氟碳面漆 氟碳底漆
氟碳稀释剂 高氯化聚乙烯底漆 高氯化聚乙烯中层漆 高氯化聚乙烯面漆 高氯化聚乙烯稀释剂
环氧地坪封闭底漆 环氧地坪中途漆 环氧地坪面漆 聚氨酯地坪面漆 丙烯酸聚氨酯地坪面漆

累死我了

回复列表 (共30个回复)

21 楼

老大,也许你的理解是对的,是一个选排列的问题(57选5),嗯,那就要使用数组了。
那么,LZ 就要明确指出,是要把这 502452720 种排列方式都打印出来(这就非常雷人啊),还是只要打印其中若干种(例如10种或者20种)就行了?如果只打印若干种,那就很简单。。。

22 楼

我想,他要打印出来然后在通过什么条件挑选。我在前面说排列怕也是不对的,因为这些东西放一起似乎没有什么先后之分,应该是你说的组合。那么数量可以降低2个数量级,有4187106种,也不少啊!
不过他一定会看的眼睛发花的,应该把挑选的条件(例如有些放一块会凝固、有些向底漆和底漆搭配没有意义等等)列出来,让程序完成。

23 楼

老大说得很对,这个题目应该是一个组合问题。组合公式我们都知道,现在的问题是如何将数学模型转化为代码,实际上就是一个算法问题。我先给出一段代码(花了我3个钟头,比全排列要麻烦一些),看大家还有什么更好的:

Option Explicit
Option Base 1

Private Sub cmd_Click() '组合代码
Dim z1 As String, z2 As String, z3 As String, z4 As String, z5 As String
Dim i1 As Integer, i2 As Integer, i3 As Integer, i4 As Integer, i5 As Integer
Dim st As String, st1 As String, st2 As String, st3 As String, st4 As String
Dim n As Integer
Dim s

s = Array("湖南 ", "广东 ", "海南 ", "四川 ", "江西 ", "上海 ", "北京 ")
n = 7
For i1 = 1 To n: st = st & i1: Next
List1.Clear

For i1 = 1 To Len(st) - 4
  z1 = Mid(st, i1, 1): st1 = Mid(st, i1 + 1)
  For i2 = 1 To Len(st1) - 3
    z2 = Mid(st1, i2, 1): st2 = Mid(st1, i2 + 1)
    For i3 = 1 To Len(st2) - 2
      z3 = Mid(st2, i3, 1): st3 = Mid(st2, i3 + 1)
      For i4 = 1 To Len(st3) - 1
        z4 = Mid(st3, i4, 1): st4 = Mid(st3, i4 + 1)
        For i5 = 1 To Len(st4)
          z5 = Mid(st4, i5, 1)
          List1.AddItem s(z1) & s(z2) & s(z3) & s(z4) & s(z5)
        Next
      Next
    Next
  Next
Next

End Sub


这段代码是从7个字符串中任选5个打印,共可打印21个组合。
LZ要使用时,需要作以下修改:

Dim s(57) As String
s(1) = "醇酸铁红底漆 ": s(2) = "醇酸磁漆 ": s(3) = "醇酸系列 "
 ....
s(57) = "丙烯酸聚氨酯地坪面漆 "
n=57

注意一点:修改以后共有4187106种组合,列表框可能放不下

24 楼

应该说你的思路在算法上是最直接的,也是最理所当然的。
另一种可以作为补充的思路就是递归。缺点是①设计对初学者困难较大②阅读程序费劲
优点只有一个,就是容易修改组合式里数目的要求。

25 楼

另外,如果你不介意,我将你的代码稍微修改一下(不影响你的主体思路)。

控件同你一样,只用command1一个、list1一个。

代码如下:
Private Sub Command1_Click()
    Dim i1 As Integer, i2 As Integer, i3 As Integer, i4 As Integer, i5 As Integer
    Dim s
    
    s = Array("湖南 ", "广东 ", "海南 ", "四川 ", "江西 ", "上海 ", "北京 ")
    List1.Clear
    
    For i1 = 1 To UBound(s) - 4
      For i2 = i1 + 1 To UBound(s) - 3
        For i3 = i2 + 1 To UBound(s) - 2
          For i4 = i3 + 1 To UBound(s) - 1
            For i5 = i4 + 1 To UBound(s)
              List1.AddItem s(i1) & s(i2) & s(i3) & s(i4) & s(i5)
            Next
          Next
        Next
      Next
    Next
End Sub

26 楼

我上面的代码中:
UBound(s) - 3、UBound(s) - 2、UBound(s) -1、UBound(s)要计算多次,是个失误!
应该进一步修改如下:
Option Explicit
Option Base 1

Private Sub Command1_Click()
    Dim i1 As Integer, i2 As Integer, i3 As Integer, i4 As Integer, i5 As Integer
    Dim end1 As Integer, end2 As Integer, end3 As Integer, end4 As Integer, end5 As Integer
    Dim s
    
    s = Array("湖南 ", "广东 ", "海南 ", "四川 ", "江西 ", "上海 ", "北京 ")
    List1.Clear
    end1 = UBound(s) - 4 '这个可以不要,只是搞点形式主义
    end2 = UBound(s) - 3
    end3 = UBound(s) - 2
    end4 = UBound(s) - 1
    end5 = UBound(s)
    For i1 = 1 To end1 '因为他只用一次,也因为我在行政机关呆久了
      For i2 = i1 + 1 To end2
        For i3 = i2 + 1 To end3
          For i4 = i3 + 1 To end4
            For i5 = i4 + 1 To end5
              List1.AddItem s(i1) & s(i2) & s(i3) & s(i4) & s(i5)
            Next
          Next
        Next
      Next
    Next
End Sub





27 楼

ok!优化后的代码言简意赅,太好了!
ps:据我所知,For 循环的终值如果是表达式,VB 会在第一次循环时将它计算出来保存,而不是每循环一次就计算一次,所以 UBound(s) 在你25楼的代码中只计算了5次

28 楼

你说的很对,是这样的。vb在建立循环控制的时候计算步长、终值。
在25楼的代码中多计算多少次,我真没有评估,只是发表后,觉得不好。假如原数据不是7个,而是楼主说的75,甚至更多(如3万),这种节省就有价值了。

29 楼

可以利用随即函数抽取5个字符串,对字符串进行排列5*4*3*2*1=120中吧,
如果是所有的那就太多了57*56*55*54*53  *5*4*3*2*1=.....60294326400.......

30 楼

这个程序只是麻烦而已,根本算不上高智商,定义一个字符串类型的数组,用一个五层嵌套的循环结构就好了,思路就是这样,其他的楼主自己做吧。

我来回复

您尚未登录,请登录后再回复。点此登录或注册