![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-02 19:47 |
共 47,813 主题排行 / 349,918 发帖 / 今日 0 篇 / 48,279 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 数值比较 |
| 可打印版本 3,820 / 19 |
| 第1楼 huahua0919 | 发表于 2010-11-11 16:15 |
| 银牌会员 发帖 780 积分 1,608 | |
|
数值比较 今天看到一个题目,放到论坛大家写写,呵呵!
从命令行输入两行字符串,字符串符合如下格式 1 1 3 5 5 3 2 1 全部由0-9十个数字组成,每个数字都是单数,且中间用空格隔开,我们把第一组输入 的表示为A,第二组的表示为B,判定A,B的每个对应位有几个相同。如下数字: ============== 1 2 3 5 1 1 5 5 ============== 其中对应为相同的有两组,分别为(1,1)和(5,5).表示为2A,如果仅有一组相同的表 示1A,三组相同表示3A,以此类推。 比较完A类型(对应为相同)后,再判定剩下的A和B,是否有相同的数字,有一组算1B, 两组算2B,不要重复比较,以此类推 上面的结果则为 2A0B.以下为类: ================== 1 1 2 2 2 2 1 1 0A4B ================== 1 3 3 3 3 1 1 1 0A2B ================== 1 2 3 4 4 3 2 1 0A4B ================== 1 1 1 1 1 1 1 1 4A0B ================== 1 3 5 6 2 3 5 9 2A0B ================== 只要输出结果nAmB |
|
| 第2楼 huahua0919 | 发表于 2010-11-13 12:15 |
| 银牌会员 发帖 780 积分 1,608 | |
|
怎么就没人写呢?要是搁以前一帮人摞代码,我将我写的垃圾代码贴出来,
|
|
| 第3楼 zhoupeng243 | 发表于 2010-11-13 12:59 |
| 新手上路 发帖 15 积分 13 | |
|
@echo off
setlocal enabledelayedexpansion color 0b set /p aa=输入A行字符: set /p bb=输入B行字符: set n=0 set m=0 for /f "tokens=1,2,3,4* delims= " %%a in ("%aa%") do ( for /f "tokens=1,2,3,4* delims= " %%i in ("%bb%") do ( set a=%%a & set b=%%b & set c=%%c & set d=%%d set i=%%i & set j=%%j & set k=%%k & set l=%%l if "!a!"=="!i!" (set /a n+=1)&(set a=a)&(set i=i) if "!b!"=="!j!" (set /a n+=1)&(set b=b)&(set j=j) if "!c!"=="!k!" (set /a n+=1)&(set c=c)&(set k=k) if "!d!"=="!l!" (set /a n+=1)&(set d=d)&(set l=l) if "!a!"=="!j!" (set /a m+=1)&(set a=a)&(set j=j) if "!a!"=="!k!" (set /a m+=1)&(set a=a)&(set k=k) if "!a!"=="!l!" (set /a m+=1)&(set a=a)&(set l=l) if "!b!"=="!i!" (set /a m+=1)&(set b=b)&(set i=i) if "!b!"=="!k!" (set /a m+=1)&(set b=b)&(set k=k) if "!b!"=="!l!" (set /a m+=1)&(set b=b)&(set l=l) if "!c!"=="!i!" (set /a m+=1)&(set c=c)&(set i=i) if "!c!"=="!j!" (set /a m+=1)&(set c=c)&(set j=j) if "!c!"=="!l!" (set /a m+=1)&(set c=c)&(set l=l) if "!d!"=="!i!" (set /a m+=1)&(set d=d)&(set i=i) if "!d!"=="!j!" (set /a m+=1)&(set d=d)&(set j=j) if "!d!"=="!k!" (set /a m+=1)&(set d=d)&(set k=k) ) ) echo. echo. echo. echo.最终的结果统计 echo.%n%A%m%B pause |
|
| 第4楼 huahua0919 | 发表于 2010-11-13 13:08 |
| 银牌会员 发帖 780 积分 1,608 | |
|
楼上的不对啊,如果A:1 1 2 2 B:2 2 1 1 答案应该是0A4B,而你的却是0A2B
|
|
| 第5楼 523066680 | 发表于 2010-11-13 22:02 |
| 银牌会员 发帖 1,133 积分 2,361 | |
|
我看了,表示没看懂。
是不是这样子: 1 1 2 2 2 2 1 1 0A4B 先进行竖向的比较,有4列 ,都是不同的,所以得到 0A 然后进行两行之间进行比较,可以匹配4组相同的(不重复匹配).所以0A4B 1 2 3 4 4 3 2 1 0A4B 这个是这种情况,然后下面那个不同了 1 1 1 1 1 1 1 1 4A0B 为什么是0B哇 ,晕掉了 ============================ 哦知道了, 就是A是按列对比的。 剩下的数字可以交错判断,1111这个是全都被A吞掉了 [ Last edited by 523066680 on 2010-11-13 at 22:10 ] |
|
| 第6楼 huahua0919 | 发表于 2010-11-13 22:15 |
| 银牌会员 发帖 780 积分 1,608 | |
|
是的,就是这样的。
|
|
| 第7楼 523066680 | 发表于 2010-11-13 23:17 |
| 银牌会员 发帖 1,133 积分 2,361 | |
|
胖胖的,而且没有写用户输入部分
[ Last edited by 523066680 on 2010-11-13 at 23:54 ] |
|
| 第8楼 523066680 | 发表于 2010-11-13 23:26 |
| 银牌会员 发帖 1,133 积分 2,361 | |
|
我还是不折腾了……
为什么例子中 1 3 3 3 3 1 1 1 0A2B =========== 不能分 11 11 33 33 咩,剔除的时候是全部相同都剔除吗 [ Last edited by 523066680 on 2010-11-13 at 23:27 ] |
|
| 第9楼 huahua0919 | 发表于 2010-11-13 23:47 |
| 银牌会员 发帖 780 积分 1,608 | |
|
1 3 3 3
3 1 1 1 是0A2B啊,最后剩下的是 3 3 1 1 |
|
| 第10楼 523066680 | 发表于 2010-11-13 23:56 |
| 银牌会员 发帖 1,133 积分 2,361 | |
|
应该可以了
1 - 3 3 - 1 3 - 1 3 - 1 0A2B |
|
| 第11楼 huahua0919 | 发表于 2010-11-14 00:05 |
| 银牌会员 发帖 780 积分 1,608 | |
|
貌似换成
1122 2211 就不行了 |
|
| 第12楼 523066680 | 发表于 2010-11-14 12:08 |
| 银牌会员 发帖 1,133 积分 2,361 | |
|
1113 3331 只得到2B 2211 1122能得到4B 我真的不懂
===================================== 再错就不干了,脚踏实地的路线: [ Last edited by 523066680 on 2010-11-14 at 14:31 ] |
|
| 第13楼 jarry0932 | 发表于 2010-11-30 21:56 |
| 初级用户 发帖 122 积分 128 | |
|
貌似小的时候有一个叫猜数字的游戏就是这样的吧。。。
|
|
| 第14楼 Hanyeguxing | 发表于 2010-11-30 23:38 |
| 银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂 | |
|
首先,定义变量组:
for %%a in (%Han1%) do set/a Ye1+=1&set #!Ye1!=%%a for %%a in (%Han2%) do set/a Ye2+=1&set @!Ye2!=%%a A值的获取,根据要求,只要同步依次比较两组识字的第几个就可以了。 for /l %%a in (1,1,%Ye1%) do if "!#%%a!"=="!@%%a!" set/a Xing1+=1 因为相同的后的数字就不再用了,所以我先定义个变量,将每组数的各个数字按序号合成:set "Gu1=!Gu1! !Ye2! ",没有比较前,两组数的序号应该是相同的,例如: 1 2 3 4 5 6 7... 每次出现相同时,同时也删除这个序号:set Gu1=!Gu1:%%a =! 因为是对应列的比较,所以两组数的剩余序号一直保持同步相同。 B值的获取,则是嵌套for后组合比较两组数字。对应列上不应有相同,因为在上一步已经删除了他们的序号,所以这里的for循环的是两组的序号。出现相同后删除这个寻列号:if "!#%%a!"=="!@%%b!" set Gu1=!Gu1:%%b =!&set/a Xing2+=Gu2 由于这个Gu1的变化是在第二个for内,所以无法立刻和 for %%b in (!Gu1!) do 的Gu1同步,解决这个问题有两种方法: 1,使用goto跳出这个for,所以把外层的for去掉,使用goto循环 2,不跳出for,但需要使出现相同后,以后的记数空运行,这里使用了set/a Xing2+=Gu2,Gu2=0 。因为Xing2+=Gu2在前,Gu2=0在后,第一次时是加1,以后依然让他继续循环,但每次加的都是0。 要求:两组数字对数一样,每个数字的位数任意,且中间用空格分隔。 方法1: [ Last edited by Hanyeguxing on 2010-12-2 at 00:39 ] |
|
| 第15楼 Hanyeguxing | 发表于 2010-12-01 10:14 |
| 银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂 | |
|
方法2:
[ Last edited by Hanyeguxing on 2010-12-2 at 00:40 ] |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |