找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 29148|回复: 12

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

[复制链接]
发表于 2013-7-29 20:14:18 | 显示全部楼层 |阅读模式
本帖最后由 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
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2013-7-29 21:46:18 | 显示全部楼层
你是说  有3个数,范围是1-5,求和为N的情况有多少种组合?
发表于 2013-7-29 21:52:25 | 显示全部楼层
不敢确定,这样算对不对?
  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
复制代码
发表于 2013-7-29 21:58:35 | 显示全部楼层
  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
复制代码

评分

参与人数 1技术 +1 收起 理由
xpw + 1 够简捷!

查看全部评分

发表于 2013-7-29 22:01:48 | 显示全部楼层
回复 1# xpw


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

:4
set /a num4+=1

:5
set /a num5+=1

每个环节之间没有用goto :eof
如果你调用了:3 , 那么从:3到:15的所有公式都+1。
这些数值被重复计算了。
发表于 2013-7-29 22:07:32 | 显示全部楼层
回复 4# PakTC


    这是排列个数吧?
发表于 2013-7-29 22:11:19 | 显示全部楼层
回复 6# apang


    没去注意,直接用楼主的改的。
只是告诉楼主重复句子多了。
还有就是没有goto :eof
发表于 2013-7-29 22:14:06 | 显示全部楼层
本帖最后由 PakTC 于 2013-7-29 22:15 编辑

楼主如果用Call可以这样

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

:func
set /a num%1+=1
 楼主| 发表于 2013-7-29 22:43: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 (...)
计算出来的结果就对了
 楼主| 发表于 2013-7-29 22:45:26 | 显示全部楼层
本帖最后由 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 种

    就是要这个计算结果!
 楼主| 发表于 2013-7-29 22:51:11 | 显示全部楼层
楼主如果用Call可以这样

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



    看来我思路还不够简捷,没想到可以这样做
发表于 2013-7-29 22:55:26 | 显示全部楼层
本帖最后由 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个结果
发表于 2013-7-29 22:57:30 | 显示全部楼层
哦,是算排列啊,楼主应该改下标题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 09:59 , Processed in 0.036396 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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