中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-26 02:05
47,812 主题排行 / 349,910 发帖 / 今日 0 篇 / 48,264 会员排行
DOS批处理 & 脚本技术(批处理室) » [挑战2] 变量的检测和计算[难度:★]
可打印版本  4,669 / 38
第16楼 flyinspace 发表于 2007-05-01 05:35
银牌会员 发帖 517 积分 1,206
Originally posted by bjsh at 2007-4-30 04:16 PM:
抽出了点时间 写了这个..
结果为:24691356902469134

不错,但会产生临时文件。

其实有办法不产生临时文件的。。youxia01 给了我们最好的提示:)
第17楼 bjsh 发表于 2007-05-01 05:44
银牌会员 发帖 621 积分 2,000
本来也不想产生临时文件;

本来想把/替换为alt+13;

不过没有实现我的想法;真想去debug看看;

无奈时间比较紧.;

就写了下来..
第18楼 zhoushijay 发表于 2007-05-01 05:50
高级用户 发帖 375 积分 845
set "num1=qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
set "num2=aaaaa2/23456789012345678/asdfssasd/asdaa"

这2个数应该是
2341234567890123456
+ 223456789012345678
-----------------------------------------
2564691356902469134
这样的吧,前面字母里还夹杂着数字呢

[ Last edited by zhoushijay on 2007-4-30 at 04:52 PM ]
第19楼 flyinspace 发表于 2007-05-01 06:07
银牌会员 发帖 517 积分 1,206
Originally posted by zhoushijay at 2007-4-30 04:50 PM:
set "num1=qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
set "num2=aaaaa2/23456789012345678/asdfssasd/asdaa"

这2个数应该是
2341234567890123456
+ 22345678901234567 ...


噢。我们只要纯数字的那一组组合呀。。
第20楼 lxmxn 发表于 2007-05-01 06:20
版主 发帖 4,938 积分 11,386
Originally posted by bjsh at 2007-4-30 16:44:
本来也不想产生临时文件;

本来想把/替换为alt+13;

不过没有实现我的想法;真想去debug看看;

无奈时间比较紧.;

就写了下来..

要把/替换成换行,可以参考一下这个:
第21楼 everest79 发表于 2007-05-01 06:28
金牌会员 发帖 1,127 积分 2,564
我原来写过的一个大数加法,根据要求改了一下

第22楼 flyinspace 发表于 2007-05-01 06:38
银牌会员 发帖 517 积分 1,206
SET/A1/T2&&SET/AT1=T1+1
SET/AT2=1/(T1/10)||SET T2=0
这个有点不明白??

SET/A1/T2 && SET/AT1=T1+1

event79兄可以解释一下么?
第23楼 everest79 发表于 2007-05-01 06:47
金牌会员 发帖 1,127 积分 2,564
这个是按字符位由右向左递增进行个位数相加

SET/A1/T2&&SET/AT1=T1+1 //set /a 1/t2这个来判断t2(t2为上一循环进位)是否为零,若不是,将当前结果t1加一
SET/AT2=1/(T1/10)||SET T2=0 //set /a t2=1/(t1/10)这个判断当前循环结果(t1)是否大于10,若大于十,t2将被赋值为一(下一循环上一步),若小于十,则将进位t2置为零
第24楼 flyinspace 发表于 2007-05-01 06:56
银牌会员 发帖 517 积分 1,206
Originally posted by everest79 at 2007-4-30 05:47 PM:
这个是按字符位由右向左递增进行个位数相加

SET/A1/T2&&SET/AT1=T1+1 //set /a 1/t2这个来判断t2(t2为上一循环进位)是否为零,若不是,将当前结果t1加一
SET/AT2=1/(T1/10)||SET T2=0 //set /a t2=1/(t1/10)这个判断当前循环结果(t1)是否大于10,若大于十,t2将被赋值为一(下一循环上一步),若小于十,则将进位t2置为零



谢谢兄的说明,我理解了这句话的含义!

新的问题是: 为什么要 set/a1/t2&&set/at1=t1+1
加这个 / 有什么用?

按你的说法:这句话相当于>
set /a xxx= 1 / t2
利用 set /a 的特殊性: 
若 xxx 小于1,则 xxx= 0
为 0 满足条件。则 t2 += 1

又学到了一招。。有点类似 set /p 的感觉?且不要=号。
第25楼 everest79 发表于 2007-05-01 07:00
金牌会员 发帖 1,127 积分 2,564
set /a a=1+1可以缩写为set/aa=1+1,那时我刚打别人实例上看到这个,所以就这么给写上了,不算好的书写习惯
第26楼 flyinspace 发表于 2007-05-01 07:06
银牌会员 发帖 517 积分 1,206
Originally posted by everest79 at 2007-4-30 06:00 PM:
set /a a=1+1可以缩写为set/aa=1+1,那时我刚打别人实例上看到这个,所以就这么给写上了,不算好的书写习惯


set /a a=1/a 也相当于 set /a1/a??
第27楼 everest79 发表于 2007-05-01 07:59
金牌会员 发帖 1,127 积分 2,564
不是的
set /a a=1/a是计算赋值
set /a 1/a只是计算
第28楼 youxi01 发表于 2007-05-02 17:35
高级用户 发帖 247 积分 846 来自 湖南==》广东
21F的代码似乎有点点问题,要继续修改下:
测试如下:


自己也发一段不成熟的代码(如果段数较多时,效率较高):
第29楼 flyinspace 发表于 2007-05-02 19:02
银牌会员 发帖 517 积分 1,206
Originally posted by youxi01 at 2007-5-2 04:35 AM:
21F的代码似乎有点点问题,要继续修改下:
测试如下:


自己也发一段不成熟的代码(如果段数较多 ...

代码看得好累。。

有没有算法??

给个提示?
第30楼 youxi01 发表于 2007-05-03 15:17
高级用户 发帖 247 积分 846 来自 湖南==》广东
::code by youxi01@cn-dos.net
@echo off & setlocal enabledelayedexpansion

set "str1=qwer/asdf2/asd34f/13546641/asdf/aaaa"
set "str2=aaaaa2/45321/asdfssasd/asdaa"

call :GetNum "%str1%" num1
call :GetNum "%str2%" num2

call :Split %num1%

REM Mnum保存结果的段数(用来接受最大的段数);
REM 将num的值重新归0,用来继续调用"函数"
REM flag为进位标记,如果为1,则下段数字加1;这里为初始值,设置为1。
set/a Mnum=%num%,num=0,flag=0

call :Split %num2%
if %Mnum% LSS %num% set/a Mnum=%num%
set/a Mnum_=%Mnum%-1

for /l %%i in (1 1 %Mnum_%) do (
set/a Rnum%%i+=!flag!
if !Rnum%%i! GTR 10000 set/a flag=1

REM 在前面加000,是为了补齐数字的,防止333这样位数不足4位的数字。
set Rnum%%i=000!Rnum%%i!

set Rnum%%i=!Rnum%%i:~-4!
set Rstr=!Rnum%%i!!Rstr!)

set/a Rnum%Mnum%+=%flag%
echo !Rnum%Mnum%!!Rstr!

pause>nul

:GetNum OBJ Res
for /f "delims=/ tokens=1,*" %%i in ("%~1") do (

REM 利用是否大于a,来检测是否是数字,如果是,则一定小于a(不管是多少位的数字)
REM 如果检测到数字,则退出。
if %%i LSS a set %2=%%i & goto :eof

REM 循环检测;
call :GetNum "%%j" %2
) & goto :eof

:Split OBJ
set str=%~1
set/a num+=1

REM 如果,切割后的数字小于10000,则设置自身的值为原值加上该数字,并退出;
if %str% LSS 10000 set/a Rnum%num%+=%str% & goto :eof

REM 利用willsort的办法,屏除类似0001给利用set/a计算带来的错误;
set/a Rnum%num%+=10000%str:~-4%%%10000

set str=%str:~0,-4%
call :Split "%str%"
上一页  1 2 3  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023