![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-10 12:07 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,255 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [挑战2] 变量的检测和计算[难度:★] |
| 可打印版本 4,506 / 38 |
| 第1楼 flyinspace | 发表于 2007-04-30 13:51 |
| 银牌会员 发帖 517 积分 1,206 | |
|
[挑战2] 变量的检测和计算[难度:★] set "num1=qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
set "num2=aaaaa2/23456789012345678/asdfssasd/asdaa" 目标:在上面两个条件中提取出纯数字的组合,并计算这两个数字的和,然后正确输出到屏幕上。(提取上面两个字符串只可以使用一个子程序,因为是测试的关系,只给出2个字符串的组合) 编写条件:cmd (help里包含的命令) 难点:随机的数字存在位和计算时的溢出 目标人群:有一定批处理基础的人。 注:挑战会逐渐提高难度。(大家尽量就自己会做的做出来) 编写积分奖励:3分。 完成提取任务的一分,完成计算任务的二分。。 加分不是目的。是对能力的一种肯定。 2楼正确获取了 随机的字符串,但在处理计算时问题上有点问题。 输出为科学记数法。。但要求是:输出精确数值。。(完成第一项,加一分) [ Last edited by flyinspace on 2007-4-30 at 01:19 PM ] |
|
| 第2楼 baomaboy | 发表于 2007-04-30 14:48 |
| 银牌会员 发帖 554 积分 1,513 | |
|
由于对P一窍不通 写个VBS吧
[ Last edited by baomaboy on 2007-4-30 at 04:37 PM ] |
|
| 第3楼 flyinspace | 发表于 2007-04-30 15:18 |
| 银牌会员 发帖 517 积分 1,206 | |
Originally posted by baomaboy at 2007-4-30 01:48 AM: 附件 1.JPG (3.91 KiB) |
|
| 第4楼 zh159 | 发表于 2007-04-30 15:41 |
| 金牌会员 发帖 1,467 积分 3,687 | |
|
楼上的,二楼结果是正确的,E+16是科学计数的写法代表N*(1后面有16个零)
24691356902469134=2.46913569024691*10000000000000000=2.46913569024691E+16 |
|
| 第5楼 flyinspace | 发表于 2007-04-30 15:46 |
| 银牌会员 发帖 517 积分 1,206 | |
|
不好意思,我也知道他的结果正确。。。。
但我们的要求是 : 输出:24691356902469134 这个结果,而不是2.46913569024691E+16 这个结果。。 这个算我没有说清楚。。。。 若我们的数字再变化一下呢?? 有 30位呢? 我们要求的是精确。。。呵呵。。 最后谢谢 zh159的指出。 |
|
| 第6楼 baomaboy | 发表于 2007-04-30 16:35 |
| 银牌会员 发帖 554 积分 1,513 | |
Originally posted by flyinspace at 2007-4-30 15:46: 那就格式化一下吧: msgbox FormatNumber(num,0,,,0) 不过估计你那最后两位34没人能得到吧,早几年在Excel中就发现超过15位后全显示0,也许是微软觉得15位已经够用了限制了吧,呵呵,开玩笑的,反正我是用不到15位不深究了,有人知道指点下。 [ Last edited by baomaboy on 2007-4-30 at 04:51 PM ] |
|
| 第7楼 digger | 发表于 2007-04-30 20:15 |
| 初级用户 发帖 29 积分 79 来自 湖南 | |
|
计算两数的和这个话题论坛里曾经有过专题讨论,在精华帖里,有难度啊。
|
|
| 第8楼 youxi01 | 发表于 2007-04-30 20:55 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
我曾经写过 大数字的 计算(乘法)的,计算数字在 100 位以内。
还有,看2F的代码 似乎 两个字符串 只是其中有一项目 是数字哦!(就是说 没有其它的特殊情况罗,比如:有两项数字又该怎么处理等?) [ Last edited by youxi01 on 2007-4-30 at 08:56 PM ] |
|
| 第9楼 youxi01 | 发表于 2007-04-30 21:26 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
提供一下思路:(因为马上要工作,就不能给出详细代码了。同时,因为搬家的原因,短期内要上不了网,所以也可能暂离联盟。)
1、关于各字符段的提取,昨天的挑战一就有相关代码。 2、提取出的各字符段,是否是数字相关判断的问题。此问题解决办法有三: 1>利用set/a 的特殊性,此办法不严谨,无法防止字符段恰好为0的情况。 2>利用findstr+正则,比较精确,但效率不高。 3>个人比较推荐的办法:拿字母(包括汉字)直接和数字比较大小,如果,某字符段是纯数字,它就一定比 a 小。缺点:无法处理特殊字符。 3、有关特大数字的计算。我们可以采取分段计算的办法,已经有相关讨论,我曾经也写过相关代码,在此不作赘述。 |
|
| 第10楼 flyinspace | 发表于 2007-04-30 22:23 |
| 银牌会员 发帖 517 积分 1,206 | |
|
给出 计算 大数字的演示,提取好象大家都会? @echo off & setlocal EnableDelayedExpansion
set "a=123456789012485642424543456" set "b=234567890000000000000005678" call :GetLen "%a%" set "Len1=%Len%" call :GetLen "%b%" set "Len2=%Len%" set "s=" set "bit=0" set "count=0" :recompute set /a "count+=1" if %Len1% GEQ 9 ( set "str1=%a:~-9% set "a=%a:~0,-9%" set /a "Len1-=9" ) else ( set "str1=%a%" set "a=0" ) if %Len2% GEQ 9 ( set "str2=%b:~-9%" set "b=%b:~0,-9% set /a "Len2-=9" ) else ( set "str2=%b%" set "b=0" ) call :formatstr %str1% set "str1=%xxx% call :formatstr %str2% set "str2=%xxx% set /a "num=!str1!+!str2!+!bit!" call :GetLen "%num%" if '%Len% GTR 9' ( set "bit=%num:~0,1%" set "num=%num:~-9%" ) set "s=%num%%s%" echo : %str1%+%str2%=%s% if "%a%"=="0" ( if "%b%" == "0" ( goto :END ) ) goto :recompute :formatstr _str_ set "xxx=%~1" :reformat set "lll=9" if "%xxx:~0,1%"=="0" ( set "xxx=!xxx:~1,%lll%! set /a "lll-=1" goto :reformat ) goto :EOF :GetLen set "string=%~1" for /l %%i in (0,1,255) do ( if "!string:~%%i,1!"=="" ( set "Len=%%i" goto :EOF ) ) goto :EOF :END echo —————————————————————————— echo 最后答案为:%s% echo —————————————————————————— echo 程序演示结束,任意键退出 & pause>nul [ Last edited by flyinspace on 2007-4-30 at 04:29 PM ] |
|
| 第11楼 zhoushijay | 发表于 2007-05-01 00:58 |
| 高级用户 发帖 375 积分 845 | |
|
num1="qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
num2="aaaaa2/23456789012345678/asdfssasd/asdaa" len1=len(num1) len2=len(num2) for i=1 to len1 nu1=mid (num1,i,1) on error resume next a=int(nu1) if err.number=0 then b=b&a end if next for a=1 to len2 nu2=mid (num2,a,1) on error resume next d=int(nu2) if err.number=0 then s=s&d end if next s=int(s) b=int(b) he=s+b msgbox(he)正确的答案应该是2564691356902469134,我用计算器算了2遍 [ Last edited by zhoushijay on 2007-4-30 at 04:53 PM ] |
|
| 第12楼 baomaboy | 发表于 2007-05-01 04:18 |
| 银牌会员 发帖 554 积分 1,513 | |
Originally posted by youxi01 at 2007-4-30 20:55: 当数值型字串与数值在一起做运算时,数值型字串被当作数值 |
|
| 第13楼 flyinspace | 发表于 2007-05-01 05:01 |
| 银牌会员 发帖 517 积分 1,206 | |
Originally posted by zhoushijay at 2007-4-30 11:58 AM: =1234567890123456 23456789012345678+ -------------------------------- 24691356902469134 怎么比也没有算错啊?? 怎么会是 2564691356902469134呢? [ Last edited by flyinspace on 2007-4-30 at 04:10 PM ] |
|
| 第14楼 bjsh | 发表于 2007-05-01 05:16 |
| 银牌会员 发帖 621 积分 2,000 | |
|
抽出了点时间 写了这个..
结果为:24691356902469134
|
|
| 第15楼 zh159 | 发表于 2007-05-01 05:17 |
| 金牌会员 发帖 1,467 积分 3,687 | |
Originally posted by zhoushijay at 2007-4-30 11:58: 16位数+17位数怎么也不可能得出19位数啊? 1234567890123456 +23456789012345678 -------------------------------------- =24691356902469134 ================= 2564691356902469134 |
|
| 1 2 3 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |