中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [挑战2] 变量的检测和计算[难度:★]
« [1] [2] [3] »
作者:
标题: [挑战2] 变量的检测和计算[难度:★] 上一主题 | 下一主题
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 16 楼』:  



  Quote:
Originally posted by bjsh at 2007-4-30 04:16 PM:
抽出了点时间 写了这个..
结果为:24691356902469134

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

其实有办法不产生临时文件的。。youxia01 给了我们最好的提示:)



知,不觉多。不知,乃求知
2007-5-1 05:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 17 楼』:  

本来也不想产生临时文件;

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

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

无奈时间比较紧.;

就写了下来..

2007-5-1 05:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhoushijay
高级用户

Autowalk


积分 845
发帖 375
注册 2007-3-3
状态 离线
『第 18 楼』:  

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 ]

2007-5-1 05:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 19 楼』:  



  Quote:
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 ...

噢。我们只要纯数字的那一组组合呀。。



知,不觉多。不知,乃求知
2007-5-1 06:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




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



  Quote:
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


   此帖被 +4 点积分     点击查看详情   
评分人:【 bjsh 分数: +4  时间:2007-5-1 07:30


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

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 21 楼』:  

我原来写过的一个大数加法,根据要求改了一下
@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 [0-9]*[0-9]&&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


   此帖被 +12 点积分     点击查看详情   
评分人:【 chenall 分数: +5  时间:2007-4-30 23:36
评分人:【 flyinspace 分数: +3  时间:2007-5-1 06:36
评分人:【 bjsh 分数: +4  时间:2007-5-1 08:22


2007-5-1 06:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 22 楼』:  

SET/A1/T2&&SET/AT1=T1+1
SET/AT2=1/(T1/10)||SET T2=0
这个有点不明白??

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

event79兄可以解释一下么?



知,不觉多。不知,乃求知
2007-5-1 06:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 23 楼』:  

这个是按字符位由右向左递增进行个位数相加

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置为零

2007-5-1 06:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 24 楼』:  



  Quote:
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 的感觉?且不要=号。



知,不觉多。不知,乃求知
2007-5-1 06:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 25 楼』:  

set /a a=1+1可以缩写为set/aa=1+1,那时我刚打别人实例上看到这个,所以就这么给写上了,不算好的书写习惯

2007-5-1 07:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 26 楼』:  



  Quote:
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??



知,不觉多。不知,乃求知
2007-5-1 07:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 27 楼』:  

不是的
set /a a=1/a是计算赋值
set /a 1/a只是计算

2007-5-1 07:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




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

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%"


   此帖被 +3 点积分      点击查看详情   
评分人:【 flyinspace 分数: +3  时间:2007-5-2 18:58


2007-5-2 17:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 29 楼』:  



  Quote:
Originally posted by youxi01 at 2007-5-2 04:35 AM:
21F的代码似乎有点点问题,要继续修改下:
测试如下:
19586
453
10039
请按任意键继续. . .
自己也发一段不成熟的代码(如果段数较多 ...

代码看得好累。。

有没有算法??

给个提示?



知,不觉多。不知,乃求知
2007-5-2 19:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




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

::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%"

2007-5-3 15:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: