中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-28 04:05
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]如何求出文本中哪些数相加等于指定的值 查看 3,749 回复 48
31 发表于 2007-03-03 22:05 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
随便给一个?那只能是把第39个换成4764...那样就唯一解。。

这个根据情况吧。否则计算量太大了。你看我说的那个累加次数!2的几十次方啊。

方法我觉得最省的就是:
1.排序
2.判断至少和至多的数字个数。
3.枚举这2个里面的数字。。。。
(这个枚举的过程我找下,懒的再想了,但是数字越多,运算就……)
32 发表于 2007-03-04 00:21 ·  中国 山东 济南 电信
初级用户
积分 125
发帖 44
注册 2007-01-24 15:31
19年会员
UID 77555
性别 女
状态 离线
又见排列组合!

没有简单算法.

n=数组中数的个数
r=从 1 到 数组中数的个数总和
在nCr中枚举是否有符合条件.....


这种程序写完了也不适合在32位系统上运行...

--------------------------------------
若仅以解决本题可采用qzwqzw兄的递归代码稍加修改.
但计算速度还是要看运气........

@ECHO %DBG% OFF
SETLOCAL ENABLEDELAYEDEXPANSION

SET /A THE=171780
FOR /F %%n IN (TEST.TXT) DO (
SET /A i+=1
SET gn!i!=%%n
)
FOR /L %%j IN (1,1,%i%) DO CALL :REC %%j
GOTO :EOF

:REC
SETLOCAL

CALL SET tmp=%%gn%1%%
SET /A sum+=%tmp%
IF %sum% GTR %THE% GOTO :EOF
SET /A lvl+=1
IF %lvl% GTR 1 (
SET exp=%exp%+%tmp%
SET /A idx+=1
CLS & ECHO 第 !idx! 次计算
IF !sum! EQU %THE% (
ECHO !exp!=%sum%
ECHO 继续计算请按任意键&PAUSE>NUL
)
) 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

运气不错!
在进行103次计算时得到第一种结果:

4816+4776+4498+4616+4948+4684+4710+5266+4760+5168+4770+5134+5076+4784+5174+4732+4782+4746+4730+5224+5164+4742+4724+4730+4762+4162+4188+4830+4942+4072+4270+4520+4808+5130+4238+5104=171780


还是那句话,此题不宜在32位系统环境下解决.
下面的附件是在22万次计算后得到的321种结果!!!!!!

[ Last edited by qjbm on 2007-3-3 at 02:29 PM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
ccwan +5 2007-03-04 22:02
附件
结果.txt (60.98 KiB, 下载附件所需积分 1 点, 下载次数: 9)
33 发表于 2007-03-04 01:21 ·  中国 广东 清远 联通
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
19年会员
UID 68504
性别 男
来自 湖南==》广东
状态 离线
TO 26F:
如果考虑重复数字的话,
最大的数字组合只要35个,而非38个!
最小的数字组合需要38个
所以,真正的数字个数有35,36,37,38等情况。
如果按照常规办法的话,根据排列组合规律,数字将会极其庞大!我已经宣布退出,期待高手。
34 发表于 2007-03-04 01:31 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
Originally posted by youxi01 at 2007-3-3 12:21:
TO 26F:
如果考虑重复数字的话,
最大的数字组合只要35个,而非38个!
最小的数字组合需要38个
所以,真正的数字个数有35,36,37,38等情况。
如 ...



哦,知道意思了。。。。。。。。。。

[ Last edited by slore on 2007-3-3 at 12:47 PM ]
35 发表于 2007-03-04 03:12 ·  中国 广东 清远 联通
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
19年会员
UID 68504
性别 男
来自 湖南==》广东
状态 离线
不是吧,效率这么低,那等我老了,都可能还没全部运算完
36 发表于 2007-03-04 03:41 ·  中国 北京 联通
初级用户
积分 83
发帖 34
注册 2006-11-24 10:50
19年会员
UID 71574
性别 男
状态 离线
理想状况下从这些结果里筛选.
72!/35!(72-35)!+72!/36!(72-36)!+72!/37!(72-37)!+72!/38!(72-38)!
37 发表于 2007-03-04 03:48 ·  中国 山东 济南 电信
初级用户
积分 125
发帖 44
注册 2007-01-24 15:31
19年会员
UID 77555
性别 女
状态 离线
72!/35!(72-35)!+72!/36!(72-36)!+72!/37!(72-37)!+72!/38!(72-38)!

n=数组中数的个数
r=从 3538
在nCr中枚举是否有符合条件.....

一样的.海量计算模式!!
38 发表于 2007-03-04 03:50 ·  中国 北京 联通
初级用户
积分 83
发帖 34
注册 2006-11-24 10:50
19年会员
UID 71574
性别 男
状态 离线
批处理应该是完成不料的...
39 发表于 2007-03-04 05:26 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
放弃了……
枚举的代码写出来了……运算的太慢了。
没响应……关闭了。。数太多了。。
40 发表于 2007-03-04 05:28 ·  中国 河北 廊坊 三河市 移动
初级用户
积分 41
发帖 19
注册 2006-12-15 00:10
19年会员
UID 73540
性别 男
状态 离线
楼上何不将代码公布,让我们学习一下?
41 发表于 2007-03-04 05:41 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
不是用p写……
P运算的话更慢……

就是递归之类……网上搜索下 组合 递归。。算法很多的,dephi的,c的,vb的……
42 发表于 2007-03-04 06:19 ·  中国 河北 廊坊 三河市 移动
初级用户
积分 41
发帖 19
注册 2006-12-15 00:10
19年会员
UID 73540
性别 男
状态 离线
那么兄可以给出c语言的代码吗?
43 发表于 2007-03-04 06:35 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
44 发表于 2007-03-04 07:34 ·  中国 广东 清远 联通
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
19年会员
UID 68504
性别 男
来自 湖南==》广东
状态 离线
不知道为什么,我写的一段代码,测出的36个数字组合要比32F的组数多的多?!
代码比32F的效率要高,但还是很不够,正在测试,稍候发布。
45 发表于 2007-03-04 07:48 ·  中国 广东 清远 联通
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
19年会员
UID 68504
性别 男
来自 湖南==》广东
状态 离线
代码如下,欢迎测试,指正。

@echo off
setlocal enabledelayedexpansion
set num=0
for /f %%n in (test.txt) do (
set /a i+=1
set gn!i!=%%n
)
for /l %%i in (1,1,36) do call :rec %%i
pause
goto :eof

:rec
setlocal
set tmp=!gn%1!
set/a flag+=1
if %flag% EQU 1 (set str=%tmp%) else set str=%str%+%tmp%
set/a sum=%sum%+%tmp%
set /a nxt1=%1+1,nxt2=%1+36
if %nxt2% gtr 72 set/a nxt2=72
set /a lvl+=1
if %lvl% lss 36 (
for /l %%j in (%nxt1%,1,%nxt2%) do call :rec %%j
) else (
set/a idx+=1
title 正在检测第 %idx% 组数 已检测出 %num% 组数
if %sum% EQU 171780 echo %str%=171780 在第 %idx% 组数 & set/a num+=1
)
endlocal & set idx=%idx% & set num=%num%

说明:本段代码给出的是针对36个数字组合时的情况,其它情况不在考虑范围内,有需要请自行更改。

[ Last edited by youxi01 on 2007-3-4 at 07:50 AM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
ccwan +5 2007-03-04 22:02
论坛跳转: