Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2883|回复: 4

[已解决]选出如此组合

[复制链接]
发表于 2015-2-26 19:52 | 显示全部楼层 |阅读模式
本帖最后由 mmc998 于 2015-2-27 06:19 编辑

选出如此的 组合,比如行2的六码组合,987,184,607,501,953,436,组成的20个三号码组合,第一个987,184,607,不重复个数是7。第二个987,184,501,不重复个数也是7。第三个987,184,953,不重复个数也是7.第四个987,184,436,不重复个数也是7。第五个987,607,501,不重复个数也是7。第六个987,607,953,不重复个数也是7。第七个987,607,436,不重复个数也是7。第八个987,501,953,不重复个数也是7。第九个987,501,436,不重复个数是九。第十个,987,953,436,不重复个数也是7。第十一个,184,607,501,不重复个数也是7。第十二个184,607,953,不重复个数是9.第十三个,184,607,436,不重复个数也是7。第十四个184,501,953,不重复个数也是7。第十五个,184,501,436,不重复个数也是7,第十六个184,953,436,不重复个数也是7。第 十七个607,501,953,不重复个数也是7。第十八个,607,501,436,不重复个数也是7。第十九个607,953,436,不重复个数也是7。第二十个,501,953,436,不重复个数也是7。
最佳答案
2015-2-27 05:29
无解,代码取符合条件的组合个数为18
  1. Sub Macro1()
  2. Dim arr, brr, w(9), i&, n%, j%, j2%, j3%, s%
  3. [g:g] = ""
  4. arr = Range("a2").CurrentRegion
  5. ReDim brr(1 To UBound(arr), 1 To 1)
  6. n = UBound(arr, 2)
  7. For i = 1 To UBound(arr)
  8.     s = 0
  9.     For j = 1 To n - 2
  10.         For j2 = j + 1 To n - 1
  11.             For j3 = j2 + 1 To n
  12.                 zf = arr(i, j) & arr(i, j2) & arr(i, j3)
  13.                 For k = 1 To 9
  14.                     z = Mid$(zf, k, 1)
  15.                     w(z) = z
  16.                 Next
  17.                 If Len(Join(w, "")) = 7 Then s = s + 1 '不重复个数7
  18.                 Erase w
  19.             Next
  20.         Next
  21.     Next
  22.      If s = 18 Then brr(i, 1) = "符合" '符合条件的组合个数
  23. Next
  24. Range("g2").Resize(UBound(brr)) = brr
  25. End Sub
复制代码
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2015-2-26 19:53 | 显示全部楼层
工作簿选六个.rar (17.57 KB, 下载次数: 9)
回复

使用道具 举报

发表于 2015-2-27 05:29 | 显示全部楼层    本楼为最佳答案   
无解,代码取符合条件的组合个数为18
  1. Sub Macro1()
  2. Dim arr, brr, w(9), i&, n%, j%, j2%, j3%, s%
  3. [g:g] = ""
  4. arr = Range("a2").CurrentRegion
  5. ReDim brr(1 To UBound(arr), 1 To 1)
  6. n = UBound(arr, 2)
  7. For i = 1 To UBound(arr)
  8.     s = 0
  9.     For j = 1 To n - 2
  10.         For j2 = j + 1 To n - 1
  11.             For j3 = j2 + 1 To n
  12.                 zf = arr(i, j) & arr(i, j2) & arr(i, j3)
  13.                 For k = 1 To 9
  14.                     z = Mid$(zf, k, 1)
  15.                     w(z) = z
  16.                 Next
  17.                 If Len(Join(w, "")) = 7 Then s = s + 1 '不重复个数7
  18.                 Erase w
  19.             Next
  20.         Next
  21.     Next
  22.      If s = 18 Then brr(i, 1) = "符合" '符合条件的组合个数
  23. Next
  24. Range("g2").Resize(UBound(brr)) = brr
  25. End Sub
复制代码
回复

使用道具 举报

发表于 2015-2-27 08:26 | 显示全部楼层
dsmch 发表于 2015-2-27 05:29
无解,代码取符合条件的组合个数为18

【无解,代码取符合条件的组合个数为18】

呵呵,服务周到啊。

写成自定义函数更方便、结果更清晰。
  1. Function f&(r As Range)
  2.     Dim a(9), i1&, i2&, i3&, j&, s$
  3.     For i1 = 1 To 4
  4.       For i2 = i1 + 1 To 5
  5.         For i3 = i2 + 1 To 6
  6.           s = r(i1) & r(i2) & r(i3)
  7.           For j = 1 To 9
  8.             a(Mid(s, j, 1)) = 1
  9.           Next
  10.           If Len(Join(a, "")) = 7 Then f = f + 1
  11.           Erase a
  12.     Next i3, i2, i1
  13. End Function
复制代码
Chk=7.zip (19.59 KB, 下载次数: 13)
回复

使用道具 举报

发表于 2015-2-27 08:58 | 显示全部楼层
0-9的10个数可以组成=Combin(10,3)=120个3位数组合,
这120个3位数组合,任取6个又可以组成=Combin(120,6)=3652745460个6码组合。

这其中,是否会有符合楼主要求的一组6个3位数中,任取3个组成=Combin(6,3)=20组9位数,
这20个9位数都能满足:【每一组含有不多、不少,正好7个不同的数字】

呵呵,有空编写程序来计算验证一下。可能需要较长时间的。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 11:01 , Processed in 1.077558 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表