中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [挑战4]: 乱序数值的提取与计算 [难度:★☆]
« [1] [2] »
作者:
标题: [挑战4]: 乱序数值的提取与计算 [难度:★☆] 上一主题 | 下一主题
youxi01
高级用户




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

呵呵,知道错在哪里了。
被CMD骗了,当数字过大的时候,它自动将 数字型数据 当作 字符串。

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





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



  Quote:
Originally posted by youxi01 at 2007-5-2 05:32 AM:
呵呵,知道错在哪里了。
被CMD骗了,当数字过大的时候,它自动将 数字型数据 当作 字符串。

呵。期待你的代码:)

比我写的强多了。。

我的好长一段。。。而且在计算乘法方面在某种情况下还是有错误。。
(都不好意思拿出来现眼)



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




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

先提示下先,可以根据位数来判断数字的大小
因为我上网不定期,说不定10天半月的都不能来了,痛哭中...

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





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



  Quote:
Originally posted by youxi01 at 2007-5-2 05:42 AM:
先提示下先,可以根据位数来判断数字的大小
因为我上网不定期,说不定10天半月的都不能来了,痛哭中...

呵呵,这段代码我们都可以修改了。。不过尊重原作者的缘故。。

        所以才等你修改呀:)

不上网的时候,正好可以放松一下哦,以后再玩挑战系列的时候,可以事半功倍的。



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




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

好,回去再想想,把代码也精简一下

2007-5-2 18:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




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

代码已经更新,欢迎测试。
::code by youxi01@cn-dos.net
::乱序数值的提取与计算 Ver 1.30
::解决某些大数字比较时存在的一些问题;
::解决大数字相减时,进退位错误问题。

@echo off
setlocal enabledelayedexpansion
title 乱序数值的提取与计算
color 1f
set "str1=999s999s9999s99999s99999s9999999s9999999999999s99999999999s99999999999s9999999"
set "str2=999888898d9999999999999999999dddddd999999999999999999999999999999999999"
set/a m=0
echo 正在提取str1中的数值...
echo.
echo 提取出的数值有:
echo.
call :GetStr "%str1%"
set Rnum
echo ---------------------------------------
set/a Resstr=1
echo 正在求取str1中各数值之积...
echo.
FOR /F "delims== tokens=2" %%i in ('set Rnum') do call :Multi !Resstr! %%i
set num1=!Resstr!
echo 计算结果为:%num1%
for /l %%i in (1 1 %i%) do set Rnum%%i=
set/a i=0,Resstr=1
echo ---------------------------------------
echo 正在提取str2中的数值...
echo.
echo 提取出的数值有:
echo.
call :GetStr "%str2%"
set Rnum
echo ---------------------------------------
echo 正在求取str2中各数值之积...
FOR /F "delims== tokens=2" %%i in ('set Rnum') do call :Multi !Resstr! %%i
set num2=%Resstr%
echo 计算结果为:%num2%

echo ---------------------------------------
echo 正在比较大小...
echo.
call :GetLen %num1% StrLen
call :GetLen %num2% StrLen_
set "MaxNum=num1" & set "MinNum=num2"
if !StrLen! LSS !StrLen_! (
      set "MaxNum=num2" & set "MinNum=num1") else if !StrLen! EQU !StrLen_! (
           for /l %%i in (0 1 %StrLen%) do (
               set/a ttstr=!num1:~%%i,1!,ttstr_=!num2:~%%i,1!
               if !ttstr! LSS !ttstr_! set "MaxNum=num2" & set "MinNum=num1" & GOTO :Res))
:Res
    echo %MaxNum% 比 %MinNum% 大
    call :Sub !%MaxNum%! !%MinNum%!
    for /f "delims=0 tokens=*" %%i in ("!OKstr!") do echo 它们的差值为:%%i
pause>nul

:GetStr OBJ
   set "str=%~1"
   set/a i=1
   for /l %%i in (0 1 1000) do (
       set "Tstr=!str:~%%i,1!"
       IF "!Tstr!"=="" call :Check Rnum!i! & goto :eof
       IF !Tstr! GEQ 0 IF !Tstr! LEQ 9 (call set Rnum!i!=%%Rnum!i!%%!Tstr!) else (
            if defined Rnum!i! call :Check Rnum!i! & set/a i+=1))
       goto :EOF
         
:Check OBJ
   for /f "delims=0 tokens=*" %%i in ("!%1!") do set %1=%%i
   GOTO :EOF

:Split OBJ num(i)Name CX
   set Rstr=%~1
   if %Rstr% LSS 10000 set "%2!%3!=%Rstr%" & goto :eof
   if "%Rstr:~-4%"=="0000" (set/a %2!%3!=0) else set/a %2!%3!=10000%Rstr:~-4%%%10000
   set/a %3+=1
   call :Split %Rstr:~0,-4% %2 %3
   goto :eof

:Multi
set/a m=0,n=0,j=0
set Resstr=
call :Split %1 Snum m
call :Split %2 Snum_ n

for /l %%i in (0 1 %m%) do (
    for /l %%j in (0 1 %n%) do (
        set/a j=%%i+%%j
        set/a ResNum!j!+=!Snum%%i!*!Snum_%%j!))

set/a j+=1,flag=0
for /l %%i in (0 1 %j%) do (
      set/a ResNum%%i+=!flag!
      if !ResNum%%i! GTR 10000 (
            set/a flag=!ResNum%%i:~0,-4!
            set ResNum%%i=!ResNum%%i:~-4!) else (
               set ResNum%%i=0000!ResNum%%i!
               set ResNum%%i=!ResNum%%i:~-4!
               set/a flag=0)
      set Resstr=!ResNum%%i!!Resstr!)
for /f "delims=0 tokens=*" %%i in ("%Resstr%") do set Resstr=%%i
for /l %%i in (0 1 %j%) do set/a ResNum%%i=0

goto :eof

:Sub MaxNum MinNum
     set/a flag1=0,m=0,n=0
     call :Split %1 ok m
     call :Split %2 ok_ n
     for /l %%i in (0 1 %n%) do (
         set/a ok%%i-=!ok_%%i!-!flag1!
         Call :Check1 ok%%i)
     if !flag1! LSS 0 (
          set/a n+=1
          for /l %%i in (!n! 1 %m%) do (
              set/a ok%%i+=!flag1!
              call :Check1 ok%%i
        )
     )
     for /l %%i in (0 1 %m%) do set OKstr=!ok%%i!!OKstr!
     goto :EOF

:GetLen OBJ Res
     set str=%~1
     for /l %%i in (0 1 10000) do (
          set tmpstr=!str:~%%i,1!
          if "!tmpstr!"=="" goto :eof
          set/a %2+=1)
     goto :EOF
         
:Check1 OBJ
        if !%1! lss 0 (
           set/a %1+=10000
           set/a flag1=-1) else set/a flag1=0
        set %1=0000!%1!
        set %1=!%1:~-4!


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


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

Autowalk


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

天啊,51回家拿了你的问题想破头都设计不出一套算法,今天到网吧看到原来不用把最后一个数字去掉的,那应该容易一点吧,回去再想……

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





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

re youxi01
     兄的代码实在漂亮。加分

re zhoushijay
     努力,实在不行可以参考youxi01的代码哦:)



知,不觉多。不知,乃求知
2007-5-6 02:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: