Board logo

标题: [数值计算] [已解决]批处理如何统计三个在指定范围内的数字的和为指定值的组合有多少种? [打印本页]

作者: xpw    时间: 2013-7-29 20:14     标题: [已解决]批处理如何统计三个在指定范围内的数字的和为指定值的组合有多少种?

本帖最后由 pcl_test 于 2016-7-31 22:43 编辑

牵扯到call语句或goto语句在for 语句中的应用,这个我不是很明白,所以一直没有正确计算出,是要再加点什么吗?
  1. @echo off &setlocal enabledelayedexpansion
  2. set num3=0
  3. set num4=0
  4. set num5=0
  5. set num6=0
  6. set num7=0
  7. set num8=0
  8. set num9=0
  9. set num10=0
  10. set num11=0
  11. set num12=0
  12. set num13=0
  13. set num14=0
  14. set num15=0
  15. set sum=0
  16. for /l %%a in (1 1 5) do (
  17.    for /l %%b in (1 1 5) do (
  18.       for /l %%c in (1 1 5) do (
  19. set /a sum=%%a+%%b+%%c
  20. call :!sum!
  21.   )
  22. )
  23. )
  24. echo 3的组合有!num3!种
  25. echo 4的组合有!num4!种
  26. echo 5的组合有!num5!种
  27. echo 6的组合有!num6!种
  28. echo 7的组合有!num7!种
  29. echo 8的组合有!num8!种
  30. echo 3的组合有!num9!种
  31. echo 10的组合有!num10!种
  32. echo 11的组合有!num11!种
  33. echo 12的组合有!num12!种
  34. echo 13的组合有!num13!种
  35. echo 14的组合有!num14!种
  36. echo 15的组合有!num15!种
  37. pause>nul
  38. :3
  39. set /a num3+=1
  40. :4
  41. set /a num4+=1
  42. :5
  43. set /a num5+=1
  44. :6
  45. set /a num6+=1
  46. :7
  47. set /a num7+=1
  48. :8
  49. set /a num8+=1
  50. :9
  51. set /a num9+=1
  52. :10
  53. set /a num10+=1
  54. :11
  55. set /a num11+=1
  56. :12
  57. set /a num12+=1
  58. :13
  59. set /a num13+=1
  60. :14
  61. set /a num14+=1
  62. :15
  63. set /a num15+=1
复制代码

作者: PakTC    时间: 2013-7-29 21:46

你是说  有3个数,范围是1-5,求和为N的情况有多少种组合?
作者: apang    时间: 2013-7-29 21:52

不敢确定,这样算对不对?
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (3 1 15) do set /a s%%a=0
  3. set /a num=0
  4. for /l %%a in (1 1 5) do (
  5.    for /l %%b in (%%a 1 5) do (
  6.       for /l %%c in (%%b 1 5) do (
  7.          set /a num=%%a+%%b+%%c
  8.          set /a s!num!+=1
  9.       )
  10.    )
  11. )
  12. for /l %%a in (3 1 15) do echo,%%a的组合有!s%%a!种
  13. pause>nul
复制代码

作者: PakTC    时间: 2013-7-29 21:58

  1. @echo off &setlocal enabledelayedexpansion
  2. for /l %%i in (3,1,15) do (
  3.     set /a N[%%i]=0
  4. )
  5. set /a sum=0
  6. for /l %%a in (1 1 5) do (
  7.    for /l %%b in (1 1 5) do (
  8.       for /l %%c in (1 1 5) do (
  9.           set /a sum=%%a+%%b+%%c
  10.           set /a N[!sum!]+=1
  11.   )
  12. )
  13. )
  14. for /l %%i in (3,1,15) do (
  15.     echo 3个[1-5]范围内的数字和为%%i 的情况有:!N[%%i]! 种
  16. )
  17. pause
复制代码

作者: PakTC    时间: 2013-7-29 22:01

回复 1# xpw


    错误在于
:3
set /a num3+=1

:4
set /a num4+=1

:5
set /a num5+=1

每个环节之间没有用goto :eof
如果你调用了:3 , 那么从:3到:15的所有公式都+1。
这些数值被重复计算了。
作者: apang    时间: 2013-7-29 22:07

回复 4# PakTC


    这是排列个数吧?
作者: PakTC    时间: 2013-7-29 22:11

回复 6# apang


    没去注意,直接用楼主的改的。
只是告诉楼主重复句子多了。
还有就是没有goto :eof
作者: PakTC    时间: 2013-7-29 22:14

本帖最后由 PakTC 于 2013-7-29 22:15 编辑

楼主如果用Call可以这样

            [此处省略若干代码]
          set /a sum=%%a+%%b+%%c
          call :func !sum!
            [此处省略若干代码]

:func
set /a num%1+=1
作者: xpw    时间: 2013-7-29 22:43

回复 3# apang

把for 嵌套改成:
for /l %%a in (1 1 5) do (
    for /l %%b in (1 1 5)do (
        for /l %%c in(1 1 5)do (...)
计算出来的结果就对了
作者: xpw    时间: 2013-7-29 22:45

本帖最后由 xpw 于 2013-7-29 22:46 编辑
PakTC 发表于 2013-7-29 21:58

3个[1-5]范围内的数字和为3 的情况有:1 种
3个[1-5]范围内的数字和为4 的情况有:3 种
3个[1-5]范围内的数字和为5 的情况有:6 种
3个[1-5]范围内的数字和为6 的情况有:10 种
3个[1-5]范围内的数字和为7 的情况有:15 种
3个[1-5]范围内的数字和为8 的情况有:18 种
3个[1-5]范围内的数字和为9 的情况有:19 种
3个[1-5]范围内的数字和为10 的情况有:18 种
3个[1-5]范围内的数字和为11 的情况有:15 种
3个[1-5]范围内的数字和为12 的情况有:10 种
3个[1-5]范围内的数字和为13 的情况有:6 种
3个[1-5]范围内的数字和为14 的情况有:3 种
3个[1-5]范围内的数字和为15 的情况有:1 种

    就是要这个计算结果!
作者: xpw    时间: 2013-7-29 22:51

楼主如果用Call可以这样

            [此处省略若干代码]
          set /a sum=%%a+%%b+%%c
         ...
PakTC 发表于 2013-7-29 22:14



    看来我思路还不够简捷,没想到可以这样做
作者: 523066680    时间: 2013-7-29 22:55

本帖最后由 523066680 于 2013-7-29 22:58 编辑

这让我想起比赛 第3题
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set au=AAAAA
  4. set bu=BBBBB
  5. set cu=CCCCC
  6. set du=DDDDD
  7. set /a n=0
  8. for /l %%a in (1 1 5) do (
  9.    for /l %%b in (1 1 5) do (
  10.       for /l %%c in (1 1 5) do (
  11.          for /l %%d in (1 1 5) do (
  12.             set /a sum=%%a+%%b+%%c+%%d
  13.             if !sum! equ 8 (
  14.                set /a n+=1
  15.                echo %%a%%b%%c%%d !au:~0,%%a!!bu:~0,%%b!!cu:~0,%%c!!du:~0,%%d!
  16.             )
  17.          )
  18.       )
  19.    )
  20. )
  21. echo 有%n%个结果
  22. pause
复制代码
有ABCD四组元素,随机组成8位字符,每组至少出现一次。
那么不同次数全列出来,有多少种形式呢?(未排列的情况下)

1115 ABCDDDDD
1124 ABCCDDDD
1133 ABCCCDDD
1142 ABCCCCDD
1151 ABCCCCCD
1214 ABBCDDDD
1223 ABBCCDDD
1232 ABBCCCDD
1241 ABBCCCCD
1313 ABBBCDDD
1322 ABBBCCDD
1331 ABBBCCCD
1412 ABBBBCDD
1421 ABBBBCCD
1511 ABBBBBCD
2114 AABCDDDD
2123 AABCCDDD
2132 AABCCCDD
2141 AABCCCCD
2213 AABBCDDD
2222 AABBCCDD
2231 AABBCCCD
2312 AABBBCDD
2321 AABBBCCD
2411 AABBBBCD
3113 AAABCDDD
3122 AAABCCDD
3131 AAABCCCD
3212 AAABBCDD
3221 AAABBCCD
3311 AAABBBCD
4112 AAAABCDD
4121 AAAABCCD
4211 AAAABBCD
5111 AAAAABCD
有35个结果
作者: apang    时间: 2013-7-29 22:57

哦,是算排列啊,楼主应该改下标题




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2