中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-27 07:20
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [挑战2] 变量的检测和计算[难度:★] 查看 4,252 回复 38
16 发表于 2007-05-01 05:35 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
Originally posted by bjsh at 2007-4-30 04:16 PM:
抽出了点时间 写了这个..
结果为:24691356902469134

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

其实有办法不产生临时文件的。。youxia01 给了我们最好的提示:)
知,不觉多。不知,乃求知
17 发表于 2007-05-01 05:44 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
19年会员
UID 75212
性别 男
状态 离线
本来也不想产生临时文件;

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

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

无奈时间比较紧.;

就写了下来..
18 发表于 2007-05-01 05:50 ·  中国 新疆 乌鲁木齐 天山区 电信
高级用户
★★★
Autowalk
积分 845
发帖 375
注册 2007-03-03 01:58
19年会员
UID 80606
性别 男
状态 离线
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 发表于 2007-05-01 06:07 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
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 发表于 2007-05-01 06:20 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
Originally posted by bjsh at 2007-4-30 16:44:
本来也不想产生临时文件;

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

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

无奈时间比较紧.;

就写了下来..

要把/替换成换行,可以参考一下这个:

@echo off&Setlocal EnableDelayedExpansion
for /f "delims=" %%a in (1.txt) do (
set str=%%a
set str=!str:/=$_!
exit|cmd/kprompt !str!>>new_.txt
)
start new_.txt
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
bjsh +4 2007-05-01 07:30
21 发表于 2007-05-01 06:28 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线
我原来写过的一个大数加法,根据要求改了一下


@ECHO OFF 2>nul 3>nul&setlocal enabledelayedexpansion
set "num1=qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
set "num2=aaaaa2/23456789012345678/asdfssasd/asdaa"
set num=%num1:/= % %num2:/= %
for %%i in (%num%) do echo %%i|findstr /b /e *&&SET Z=/0%%i !z!
call :next %z%&&goto :eof
:next
set A=%~1&set B=%~2
:ADD
SET/AX-=1
CALL SET/AT1=%%A:~%X%,1%%+%%B:~%X%,1%%||(
ECHO %T3%%C%&&PAUSE&&GOTO :EOF)
CALL SET T3=%%A:~2,%X%%%%%B:~2,%X%%%
SET/A1/T2&&SET/AT1=T1+1
SET/AT2=1/(T1/10)||SET T2=0
SET C=%T1:~-1%%C%
GOTO ADD
本帖最近评分记录 (共 3 条) 点击查看详情
评分人分数时间
chenall +5 2007-04-30 23:36
flyinspace +3 2007-05-01 06:36
bjsh +4 2007-05-01 08:22
22 发表于 2007-05-01 06:38 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
SET/A1/T2&&SET/AT1=T1+1
SET/AT2=1/(T1/10)||SET T2=0
这个有点不明白??

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

event79兄可以解释一下么?
知,不觉多。不知,乃求知
23 发表于 2007-05-01 06:47 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线
这个是按字符位由右向左递增进行个位数相加

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 发表于 2007-05-01 06:56 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
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 发表于 2007-05-01 07:00 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线
set /a a=1+1可以缩写为set/aa=1+1,那时我刚打别人实例上看到这个,所以就这么给写上了,不算好的书写习惯
26 发表于 2007-05-01 07:06 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
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 发表于 2007-05-01 07:59 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线
不是的
set /a a=1/a是计算赋值
set /a 1/a只是计算
28 发表于 2007-05-02 17:35 ·  中国 广东 清远 英德市 电信
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
19年会员
UID 68504
性别 男
来自 湖南==》广东
状态 离线
21F的代码似乎有点点问题,要继续修改下:
测试如下:

19586
453
10039
请按任意键继续. . .


自己也发一段不成熟的代码(如果段数较多时,效率较高):

::code by youxi01@cn-dos.net
@echo off & setlocal enabledelayedexpansion
set "str1=qwer/asdf2/asd34f/13546641654546546654654654144553098785546154/asdf/aaaa"
set "str2=aaaaa2/453216543225443263845482842643/asdfssasd/asdaa"
call :GetNum "%str1%" num1
call :GetNum "%str2%" num2
call :Split %num1%
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
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 (
if %%i LSS a set %2=%%i & goto :eof
call :GetNum "%%j" %2
) & goto :eof
:Split OBJ
set str=%~1
set/a num+=1
if %str% LSS 10000 set/a Rnum%num%+=%str% & goto :eof
set/a Rnum%num%+=10000%str:~-4%%%10000
set str=%str:~0,-4%
call :Split "%str%"
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
flyinspace +3 2007-05-02 18:58
29 发表于 2007-05-02 19:02 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
Originally posted by youxi01 at 2007-5-2 04:35 AM:
21F的代码似乎有点点问题,要继续修改下:
测试如下:

19586
453
10039
请按任意键继续. . .


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

代码看得好累。。

有没有算法??

给个提示?
知,不觉多。不知,乃求知
30 发表于 2007-05-03 15:17 ·  中国 广东 清远 英德市 电信
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
19年会员
UID 68504
性别 男
来自 湖南==》广东
状态 离线
::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%"
论坛跳转: