中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [共同参与][挑战思路] 求一列数所有不同组合的和
« [1] [2] »
作者:
标题: [共同参与][挑战思路] 求一列数所有不同组合的和 上一主题 | 下一主题
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『楼 主』:  [共同参与][挑战思路] 求一列数所有不同组合的和

  给出一个纯数值文本,一行一条记录,无空行,求这一列数值所有不同组合的和(行号相同而数值出现顺序不同的组合视为同一组合),要求输出格式为 n1+n2+n3=sum。

  比如文本内容为:
1
2
3
4
5
  要求输出的格式为(次序可以打乱):
1+2=3
1+3=4
1+4=5
1+5=6
2+3=5
2+4=6
2+5=7
3+4=7
3+5=8
4+5=9
1+2+3=6
1+2+4=7
1+2+5=8
1+3+4=8
1+3+5=9
1+4+5=10
2+3+4=9
2+3+5=11
3+4+5=12
1+2+3+4=10
1+2+3+5=11
1+3+4+5=13
2+3+4+5=14
1+2+3+4+5=15
  1+2+3=6 和 2+1+3=6 视作同一组合。

[ Last edited by namejm on 2006-12-29 at 09:55 PM ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-12-30 10:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  


  不明白是什么意思?举个简单的例子?


2006-12-30 10:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 3 楼』:  

namejm兄的意思是一个文本中每一行都有一个数字(大概二十个数), 要计算出这些数字所有可能的和.

test.txt
1
2
3
要求用批处理处理后的结果为:
1+2=3
1+3=4
2+3=5
1+2+3=6




业精于勤而荒于嬉,形成于思而毁于随。
2006-12-30 10:54
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『第 4 楼』:  


@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /f "tokens=1,2 delims=:" %%i in ('findstr /n . 1.txt') do (
set /a n%%i=%%j
set /a nnum=%%i
)
if "nnum" == "1" echo %n1%=%n1% && goto :eof
:num
set sum=
set sumf=
set /a num+=1
set /a num_1=%num%+1
set /a nnum_1=%nnum%-1
for /l %%i in (%num% 1 %nnum%) do (
call set /a sum=!sum!+%%n%%i%%
call set sumf=!sumf!+%%n%%i%%
if "!sumf!" == "+!sum!" (set sumf=!sumf:~1!) ELSE (echo !sumf!=!sum!)
)
for /l %%i in (%num_1% 1 %nnum_1%) do (
call set /a sum=!sum!-%%n%%i%%
call set sumf=!sumf:+%%n%%i%%=!
echo !sumf!=!sum!)
)
if %num% lss %nnum% goto :num
pause
代码并不完善,下面这个替换不知道应该怎么写,希望大家指正
call set sumf=!sumf:+%%n%%i%%=!

   此帖被 +7 点积分     点击查看详情   
评分人:【 无奈何 分数: +4  时间:2007-1-1 03:16
评分人:【 ccwan 分数: +3  时间:2007-1-1 03:27




bat c c++
2006-12-30 19:53
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
Primalchaos
初级用户





积分 41
发帖 19
注册 2006-12-15
状态 离线
『第 5 楼』:  

顶起来!想知道。

2006-12-31 04:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 6 楼』:  

a9319751 兄的代码错误较多,发现的错误有丢失了组合、重复、部分计算结果错误等。

namejm 兄提出的这个问题,非常复杂。我一直没有找到好的方法,现在我能完成的最好情况也丢失 4 组组合,我知道问题出在哪里,苦于没有办法转换成有效的批处理语句。
先帖一下代码,以后有时间再完善吧,希望能看到哪位兄弟完成这个题目。

  Quote:

  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set n=0
  4. set file=%1
  5. set yinzi=
  6. for /f "delims=" %%a in (%file%) do (
  7.         set /a n+=1
  8.         call :sub %%a !n!
  9. )
  10. goto :EOF

  11. :sub
  12. for /f "tokens=1,2* delims=:" %%a in ('more +%2 %file%^|findstr /n .') do (
  13.         call set yinzi%%a=%1
  14.         for /l %%m in (1,1,%%a) do (
  15.                 call set yinzi%%m=!!yinzi%%m!! + %%b
  16.                 call set /p x=!!yinzi%%m!! = <nul
  17.                 call set /a x=!!yinzi%%m!!
  18.                 echo !x!
  19.         )
  20. )
  21. goto :EOF
        无奈何发表于    2006-12-30  16:25

输出结果:
1 + 2 = 3
1 + 2 + 3 = 6
1 + 3 = 4
1 + 2 + 3 + 4 = 10
1 + 3 + 4 = 8
1 + 4 = 5
1 + 2 + 3 + 4 + 5 = 15
1 + 3 + 4 + 5 = 13
1 + 4 + 5 = 10
1 + 5 = 6
2 + 3 = 5
2 + 3 + 4 = 9
2 + 4 = 6
2 + 3 + 4 + 5 = 14
2 + 4 + 5 = 11
2 + 5 = 7
3 + 4 = 7
3 + 4 + 5 = 12
3 + 5 = 8
4 + 5 = 9
丢失项:
1+2+4=7
1+2+5=8
1+3+5=9
2+3+5=11


   此帖被 +15 点积分       点击查看详情   
评分人:【 ccwan 分数: +9  时间:2007-1-1 03:27
评分人:【 redtek 分数: +5  时间:2007-1-1 04:43
评分人:【 yuhaomiao 分数: +1  时间:2007-1-2 04:57




  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-12-31 05:38
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 7 楼』:  

也贴一段效率不怎样高的代码:
@echo off
setlocal enabledelayedexpansion

for /f %%i in (test.txt) do (
   set flag=%%i

REM ===========================
REM 删除重复行;
Rem ===========================
   if not defined !flag! (
      set %%i=A

REM ===========================
REM 获取文件行数;
Rem ===========================

      set /a CYC_num_+=1
      set str=%%i !str!))

REM ===========================
REM 设置下个for循环次数;
Rem ===========================
set /a CYC_num=%CYC_num_%-3



call :test str
for /l %%i in (1 1 %CYC_num%) do call :test Res
pause>nul
:test
for /f "delims== tokens=2" %%i in ('set %1') do (
   set tem=%%i
   for %%a in (%%i) do (
      set flag=!tem:%%a =!
      if not defined !flag! (
          set var=
          set num=
          set /a a+=1
          set Res!a!=!tem:%%a =!
          call :Get_SUM %%Res!a!%%
          set !flag!=A
      )
   )
)
goto :eof

:Get_SUM
    if not "%1"=="" (
        set var=%1+!var!
        set /a num+=%1
        shift
        goto :Get_SUM)
     echo !var:~0,-1!=!num!
说明:文本文件test.txt中的数字至少需要不重复的三行!

   此帖被 +22 点积分      点击查看详情   
评分人:【 无奈何 分数: +8  时间:2007-1-1 03:15
评分人:【 ccwan 分数: +7  时间:2007-1-1 03:27
评分人:【 redtek 分数: +7  时间:2007-1-1 04:42


2006-12-31 12:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dbc6013
初级用户





积分 55
发帖 16
注册 2006-10-27
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by 无奈何 at 2006-12-31 05:38 AM:
a9319751 兄的代码错误较多,发现的错误有丢失了组合、重复、部分计算结果错误等。

namejm 兄提出的这个问题,非常复杂。我一直没有找到好的方法..

这个问题我非常关注,能讲一下思路吗?
其他高手也可以讲一下,
在这里先谢过了。

   此帖被 +2 点积分    点击查看详情   
评分人:【 flamey 分数: +2  时间:2007-1-1 04:53


2006-12-31 21:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 9 楼』:  

此类问题使用递归算法思路要清晰的多

多层循环虽然也可以实现,不过非常难于编写和阅读

下面是一个递归的例子
@echo off
setlocal enabledelayedexpansion

for /f %%n in (test.txt) do (
    set /a i+=1
    set gn!i!=%%n
)
set gn
pause

for /l %%j in (1,1,%i%) do call :rec %%j
pause
goto :eof

:rec
setlocal

call set tmp=%%gn%1%%
set /a sum+=%tmp%
set /a lvl+=1
if %lvl% gtr 1 (
    set exp=%exp%+%tmp%
    set /a idx+=1
    echo !idx!:!exp!=%sum%
) else (set exp=%tmp%)

set /a nxt=%1+1
for /l %%j in (%nxt%,1,%i%) do call :rec %%j

endlocal & set idx=%idx%
goto :eof
[ Last edited by qzwqzw on 2006-12-31 at 01:48 PM ]

   此帖被 +77 点积分       点击查看详情   
评分人:【 无奈何 分数: +12  时间:2007-1-1 03:15
评分人:【 ccwan 分数: +11  时间:2007-1-1 03:26
评分人:【 namejm 分数: +12  时间:2007-1-1 04:09
评分人:【 tghksj 分数: +2  时间:2007-1-1 04:39
评分人:【 redtek 分数: +11  时间:2007-1-1 04:41
评分人:【 flamey 分数: +2  时间:2007-1-1 04:55
评分人:【 qasa 分数: +2  时间:2007-1-5 15:16
评分人:【 lxmxn 分数: +10  时间:2007-1-5 23:48
评分人:【 pengfei 分数: +15  时间:2007-1-7 13:15


2007-1-1 02:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Primalchaos
初级用户





积分 41
发帖 19
注册 2006-12-15
状态 离线
『第 10 楼』:  

佩服!不但实现结果,还能显示到底有多少组组合

2007-1-1 02:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 11 楼』:  

几位的代码确实精彩,蕴含着智慧和厚重的知识积累,是我学习的榜样。



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2007-1-1 03:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
weapfe
初级用户




积分 144
发帖 66
注册 2006-11-30
状态 离线
『第 12 楼』:  九楼的代码好像也...

如题.我的test.txt的内容为:



运行结果是:
gn1=1
gn2=2
gn3=3
请按任意键继续. . .
1:1+2=3
2:1+2+3=6
3:1+3=4
4:2+3=5
请按任意键继续. . .
不知是....

2007-1-1 04:20
查看资料  发送邮件  发短消息 网志  OICQ (261372684)  编辑帖子  回复  引用回复
tghksj
社区乞丐

此图片另存后死机



积分 -49
发帖 90
注册 2006-12-2
状态 离线
『第 13 楼』:  

9楼 qzwqzw

我只能加两分,你的代码拿回家仔细看...

没看出来排除重复组合部分啊?

--------------------
我先慢慢看,
现在第一个pause之前完全理解了.....
---------------------
在 :rec 这转不出来了.............

谁能告诉我那个 %1 是怎么回事吗????
------------------------------------
知道 += 是怎么回事了........原来和C差不多....
------------------------------------
......
ECHO ON了之后
代码对着结果顺下来一遍.....
:rec 还是不大理解....
-------------------------
再看,一定看明白了~学C的时候递归就没学好,这次一定努力一下.......
----------------------
明白了......看懂了!

[ Last edited by tghksj on 2007-1-1 at 11:58 AM ]



我的网络笔记本.[color=Red]非联系本人请勿访问![/color]http://w.vicp.net[img]http://zhenlove.com.cn/cndos/fileup/files/QM2.jpg[/img]
2007-1-1 04:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flamey
初级用户





积分 152
发帖 74
注册 2005-12-1
状态 离线
『第 14 楼』:  

加错分了!!!!

2007-1-1 04:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tao0610
高级用户

朦胧的世界


积分 579
发帖 218
注册 2006-10-24
状态 离线
『第 15 楼』:  

几天假期多了不少好东西....

9楼的递归确实是妙,但考虑到效率最好避开FOR的嵌套和CALL递归.

不支持重复数.
@echo off&setlocal enabledelayedexpansion
set n=1
for /f %%n in (test.txt) do (
    set /a i+=1
    set str!i!=%%n
)
set str
pause&echo.

:loop
set/a n+=1
if not defined str%n% goto end
for /f "tokens=1* delims==" %%a in ('set result 2^>nul') do (
set/a x+=1
set result!x!=%%b+!str%n%!
)
set/a f=n-1
if not defined flag!str%n%! for /l %%j in (1,1,%f%) do (
set/a x+=1
set result!x!=!str%%j!+!str%n%!
)
set/a flag!str%n%!+=1
goto :loop

:end
for /f "tokens=1* delims==" %%a in ('set result 2^>nul') do (
set/a id+=1
set/a %%a=%%b
echo !id!:%%b=!%%a!
)
pause&goto :eof


   此帖被 +28 点积分       点击查看详情   
评分人:【 lxmxn 分数: +10  时间:2007-1-5 23:54
评分人:【 redtek 分数: +9  时间:2007-1-7 00:56
评分人:【 pengfei 分数: +5  时间:2007-1-7 13:17
评分人:【 Hanyeguxing 分数: +4  时间:2009-7-5 09:00





认识自己,降伏自己,改变自己
,才能改变别人!
2007-1-5 08:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: