[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-068】批处理号码筛选练习

本帖最后由 batman 于 2012-2-29 10:25 编辑

出题目的:
  强化新手对字符截取和if判断的理解
加分原则:
  满分20分,其中解题思路7分,思路描述3分,代码运行效率4分,代码简洁4分,书写规范2分,
  本帖内同一id累计加分不超过40分(请大家在加分时注意)
  如管理层和技术组解题分值减半
  跟帖讨论的视情况加分,最高不超过10分
相关要求:
  请新手自觉独立解题不得抄袭别人代码(可以借鉴)
  请测试代码成功后再发帖
  请最好附上思路说明
题目如下:
  编写批处理代码对所有4位号码进行筛选归类,归类原则如下:
    一类 8888
    二类 x888 aaaa abcd
    三类 xx88 xaaa xabc aabb abab
    四类 xxx8 xxaa abba
    五类 其余的号码
    其中
      x表示不等于其后一位数值的任意数值
                 aaaa为除8888以外的4连号如0000 xaaa xxaa以此类推
      abc abcd代表顺子如123 321 1234 4321
      aabb为形如1122的号码 abab为形如1212的号码 abba为形如1221的号码
***共同提高***

回复 3# jinzeyu


    是的,顶楼应该描述得很清楚吧。。。
***共同提高***

TOP

回复 6# QIAOXINGXING


    兄弟是不是想复杂了,这个思路应该很好理的。。。
***共同提高***

TOP

本帖最后由 batman 于 2012-3-29 09:05 编辑

参考答案
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /l %%a in (10000,1,19999) do (
  3.   set "str=%%a"&set "str=!str:~1!"&set "flag=五类"
  4.   set /a a=!str:~,1!,b=!str:~1,1!,c=!str:~2,1!,d=!str:~-1!,b1=b+1,b2=b-1,c1=c+2,c2=c-2,d1=d+3,d2=d-3
  5.   if "!d!" equ "8" set "flag=四类"
  6.   if "!c!" equ "!d!" set "flag=四类"
  7.   if "!a!!b!" equ "!d!!c!" set "flag=四类"
  8.   if "!c!!d!" equ "88" set "flag=三类"
  9.   for %%a in (!b!) do if "!str:%%a=!" equ "!a!" set "flag=三类"
  10.   if "!a!!b!" equ "!c!!d!" set "flag=三类"
  11.   if "!a!!c!" equ "!b!!d!" set "flag=三类"
  12.   for %%a in (1 2) do if "!b%%a!!c%%a!!d%%a!" equ "!b%%a!!b%%a!!b%%a!" set "flag=三类"
  13.   if "!b!!c!!d!" equ "888" set "flag=二类"
  14.   for %%a in (!a!) do if "!str:%%a=!" equ "" set "flag=二类"
  15.   for %%a in (1 2) do if "!a!!b%%a!!c%%a!!d%%a!" equ "!a!!a!!a!!a!" set "flag=二类"
  16.   if "!str!" equ "8888" set "flag=一类"
  17.   echo !flag! !str!
  18. ))>list.txt
  19. start list.txt
复制代码
***共同提高***

TOP

本帖最后由 batman 于 2012-3-27 10:07 编辑

在此对本题进行一下说明:
  其实本题真的不难,主要还在于判断的技巧性。总的来说有两种筛选的方法,一种是由低级向高级的筛选法,
我们就叫做正向筛选法吧(如11楼)。对任一个四位数我们先将它暂定为五类(set "flag=五类"),然后逐步
判断它是不是符合四、三、二、一类的标准,如果符合标准,flag变量就被重新赋值,最后输出flag的值(?类)
。另一种方法就是由高级向低级的筛选,我们就叫做反向筛选法。对任一个四位数我们先判断它是不是一类,如果
是就标识为一类号码,否则继续判断是不是二类,如果是就标识为二类号码,否则继续以此类推向下判断,最后将
数字标识为它属于的类别。
  这两种筛选方法各有千秋,总体上来说正向筛选法效率较差但代码相对会简单些,就是一行一行的if语句写下
来,而反向筛选法效率较高但代码会相对复杂点,因为其中涉及到数层的if嵌套。
  另外说下筛选中的难点(正反向一样),个人认为最难的就是abcd和abc顺子的判断,但是只要你抓住了这
类号码的特点,也不是很难的事。因为无论是正顺还是反顺,几个数值间肯定是一个以1或-1为差的等差数列,
所以我们只要将后面的数值依次减上其与第一个数值a的差,然后判断生成的新数值是不是一个aaaa 或aaa就可
以了。
***共同提高***

TOP

回复 17# neorobin
是的,题意本来如此,只怪顶楼举例用了1212 2121 1221这样特殊的数值误导了兄弟,对不起了。。。
***共同提高***

TOP

回复 19# qzwqzw


    刚重新看了下自己的代码,确实出现这个低级错误,原因是在前面我已将str变量截取了一位,在后面不记得又截取了一位,所以将8888归到了第二类,现已改正。。。
***共同提高***

TOP

返回列表