Board logo

标题: 批处理一问一答,问为重 [打印本页]

作者: wxcute    时间: 2008-9-17 22:01     标题: 批处理一问一答,问为重

 n层:我问一个问题                    //当然问题要清楚,不要改来改去
n+1层:这层回答问题,并提出一个新问题
           //最好提出新问题
n+2层:如果上一层没有提出新问题,则这层必须提出一新问题  //可回答n层的问题,也可只提新问题


先来个:

列出100以内的素数

质数(又称为素数)


在所有比1大的整数中,除了1和它本身以外,不再有别的约数,这种整数叫做质数。
作者: pusofalse    时间: 2008-9-17 22:40

这个方法好啊~以游戏的方式.
为支持楼主,我先来解第一道题吧。
  1. @echo off&setlocal enabledelayedexpansion
  2. echo 2
  3. for /l %%a in (3 2 100) do set/a n=2,m=%%a&call :lp %%a
  4. pause>nul&exit/b
  5. :lp
  6. set/a mod=m%%n
  7. if %mod% equ 0 (
  8.    set "res=%res%%n%*"
  9.    set/a m/=n
  10.    goto lp
  11.    ) else (
  12.    set/a n+=1
  13.    if !n! leq !m! goto lp
  14. )
  15. if "!res:~,-1!" equ "%1" echo !res:~,-1!
  16. set "res="
复制代码
效率不怎么样,因为是先分解出每个数的质因数,最后再作比较,期待好的方案。
昨晚思维定向的厉害,简化:
  1. @echo off&setlocal enabledelayedexpansion
  2. echo 2
  3. for /l %%a in (3 2 100) do (
  4.      set/a m=%%a-1,a=0
  5.      for /l %%i in (2 1 !m!) do (
  6.           set/a n=%%a%%%%i
  7.           if !n! equ 0 set a=1
  8.      )
  9.      if !a! equ 0 echo %%a
  10. )
  11. pause
复制代码
第2题:
列出100以内所有能被3整除的偶数。

[ 本帖最后由 pusofalse 于 2008-9-18 02:50 编辑 ]
作者: batman    时间: 2008-9-18 10:57

这种学习的思路妙,我来解第二题:
  1. @echo off
  2. :begin
  3. set /a n+=2,m=n*3
  4. if %m% lss 100 (
  5.    echo %m%&goto begin
  6.    ) else (
  7.    pause>nul
  8. )
复制代码
同时,本人给出第三题:
列出1-100内所有大于23小于90且能被5整除的偶数(比较容易哦)
作者: lovelymorning    时间: 2008-9-18 16:53

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (24,1,89) do (
  4. set a=%%i
  5. if "!a:~-1!"=="0" echo %%i
  6. )
  7. pause
复制代码
不知是否正确

原理很简单,大于 23,那就是从 24 开始,小于 90 那就只能到 89
被5整除,尾数就必须是 0  或 5 ,而又要求是偶数,所以只需要检测从24到89产生的数列中哪些数最后一位是0的那就满足要求了


第四题:

列出1-100内所有能被2和5整除的偶数(也很简单喔~~~)
作者: pusofalse    时间: 2008-9-18 17:50     标题: 回复 4楼 的帖子

楼上的兄弟少了25 35 。。。
还有你的问题是既能被2整除,又要被5整除?
还是只是被2或5其中一个整除?
作者: lovelymorning    时间: 2008-9-18 18:46

原帖由 pusofalse 于 2008-9-18 17:50 发表
楼上的兄弟少了25 35 。。。
还有你的问题是既能被2整除,又要被5整除?
还是只是被2或5其中一个整除?


25,35……

是偶数吗?老师没教这个耶。。。

即可以被2整除,又可以被5整除,就是两个条件都要成立

比喻

10÷2=5
10÷5=2
作者: pusofalse    时间: 2008-9-18 18:59     标题: 回复 6楼 的帖子

oh。。。sorry,看错题意了~不好意思。
作者: youxi01    时间: 2008-9-18 20:54

前面的题目运行效率还有很大的提升空间啊!
回4F,投机取巧(现在的课本0是自然数也是偶数,奇怪)
测试代码:
  1. @echo off
  2. for /l %%i in (0 10 100) do echo 100以内能被2和5整除的数有: %%i
  3. pause>nul
复制代码
第五题:产生90个0-100间的不重复的随机数字
作者: lovelymorning    时间: 2008-9-18 21:33

献丑了。。。
  1. @echo off&set n=1
  2. :st
  3. set /a w=%random%%%100
  4. if not defined %w% (
  5. if "%n%" LEQ "90" (
  6. echo %w%
  7. set w=ok
  8. set /a n+=1
  9. goto st
  10. )
  11. )
  12. pause
复制代码
代码还是有待提高。。。

暂时想不到要问什么问题,等待楼下出题。。Sorry!

PS:真想不透现在的课本,乍就这样呢,当时读的时候,0 可不是自然数啊

[ 本帖最后由 lovelymorning 于 2008-9-19 13:18 编辑 ]
作者: wxcute    时间: 2008-9-19 21:44

9楼代码有问题,因为%w%是一直not defined的,所以运行结果是可能会有重复的
改成如下:
  1. @echo off
  2. :lp
  3. set/a n=%random%%%100
  4. if not defined _%n% (
  5. set _%n%=%n%
  6. echo %n%
  7. set/a num+=1
  8. )
  9. if not %num% gtr 90 goto :lp
  10. pause
复制代码
第六题:产生一个三位的随机数,并计算各位数字相加的和
(如:产生的随机数是123,和为1+2+3=6)(不难吧)
作者: lovelymorning    时间: 2008-9-19 22:52

晕,漏了 set %w%=ok 百分号了,无语
  1. @echo off
  2. set n=1
  3. :st
  4. set /a w=%random%%%100
  5. if not defined %w% (
  6. if "%n%" LEQ "90" (
  7. echo %w%
  8. set %w%=ok
  9. set /a n+=1
  10. goto st
  11. )
  12. ) else goto st
  13. pause
复制代码
这个,不知行不

原先那个,我测试了好几次,都没出现重复,难道是RP较好?

这个,应该不会了吧?
作者: lovelymorning    时间: 2008-9-19 22:58

回第六题:
  1. @echo off
  2. set /a n=%random%%%999+100
  3. echo %n%
  4. set /a h=%n:~0,1%+%n:~1,1%+%n:~-1%
  5. echo %h%
  6. pause
复制代码
不知这个合格不?

还是不知要问啥,老规矩,等楼下问吧



突然想到了,就俺来问吧

第七题:用 random 产生一个数,然后计算它的所有位数的相加和
比喻,产生了 1432  那就是 1+2+3+4=10
           产生了 4327 那就是 2+3+4+7=16

但 random 产生的数,位数又是不知的,又要计算它的和,难度应该不小吧。。。

楼下显高招。。。

[ 本帖最后由 lovelymorning 于 2008-9-19 23:02 编辑 ]
作者: pusofalse    时间: 2008-9-19 23:08     标题: 回复 12楼 的帖子

set /a n=%random%%%999+100
这里n的值有可能大于有可能是个4位数哦,比如998+100=1098>999
作者: lovelymorning    时间: 2008-9-19 23:21

原帖由 pusofalse 于 2008-9-19 23:08 发表
set /a n=%random%%%999+100
这里n的值有可能大于有可能是个4位数哦,比如998+100=1098>999


版主想问题就是全面,唉……菜鸟,总是缺这少那的

请问一下,如果改成 899  ,可以么?
作者: pusofalse    时间: 2008-9-19 23:38     标题: 回复 14楼 的帖子

^_^
set /a n=%random%%%899+100
如果除以899取余+100,那么n的值是999的概率就是0了,随机的概率应该相等吧。^_^
作者: lulu520zlh    时间: 2008-9-20 18:09

直接取1000不可以吗?还有12楼的问题好象跟10楼的差不多啊~~
作者: pusofalse    时间: 2008-9-20 19:23     标题: 回复 16楼 的帖子

要求是3位数之间的,取余1000的话会包含2位数。
作者: wxcute    时间: 2008-9-20 19:38

第六个可能是大家计算多一个少一个的没算清楚
举例:0-9是10个数
同理:100-999是900个数

正确的解法可以是如下:
  1. @echo off
  2. :lp
  3. cls
  4. set /a n=%random%%%900+100
  5. echo %n%
  6. set /a h=%n:~0,1%+%n:~1,1%+%n:~-1%
  7. echo %h%
  8. pause
  9. goto :lp
复制代码
大家还是回答第七个吧!
作者: lovelymorning    时间: 2008-9-20 20:41

第七题:
  1. @echo off
  2. set h=%RANDOM%
  3. echo %h%
  4. set /a zh=%h:~0,1%+%h:~1,1%+%h:~2,1%+%h:~3,1%+%h:~4,1%
  5. echo %zh%
  6. pause
复制代码
请高手指点。。。

set 帮助中说到:在表达式中的任何非数字字符串键作为环境变量
名称,这些环境变量名称的值已在使用前转换成数字。如果指定
了一个环境变量名称,但未在当前环境中定义,那么值将被定为
零。

所以,如果 %RANDOM% 出来的是一位,那么后面的  %h:~1,1%   %h:~2,1%      %h:~3,1%       %h:~4,1%  将不存在,set 就定义为 0  ,那 0 跟任何数相加,都是没影响的

如果是产生了 5 位数,那这些变量都存在,也就可以正常相加了

又是一次投机取巧。。。
作者: pusofalse    时间: 2008-9-20 21:44

这种写法有误,你漏掉了set/?中重要的一句话:“。。。这使您可以使用环境变量值做计算而不用键入那些 % 符号来得到它们的值。。。”
不必键入%来闭合变量,是因为在set/a的运算中,如果用到了变量截取,而截取的字符恰好是空值,不会扩展为0,而是空值。
set n=123,给n赋值,三位数--123
set/a zh=%n:~0,1%+%n:~1,1%+%2,1%
会被扩展为set/a zh=1+2+3,这样没错。
但现在的这个题目中,是随机数,未知多少位,如果n的值仍是123,如果写成:
set/a zh=%n:~0,1%+%n:~1,1%+%2,1%+%n:~3,1%
则会扩展为set/a zh=1+2+3+
%n:~3,1% 在此处替换为了空值,空留一个+跟在其后,set/a 中没有这样的用法,所以会提示找不到操作数。
在未知多少位的情况下,可以先用if来判断:
  1. @echo off&setlocal enabledelayedexpansion
  2. set h=!random!!random!!random!!random!
  3. for /l %%a in (0 1 10000) do (
  4.       if "!h:~%%a,1!" neq "" (
  5.            set/a zh+=!h:~%%a,1!
  6.            ) else (
  7.            echo !zh!
  8.            pause&exit/b
  9. ))
复制代码

以上代码,假设h的值是个小于10000位数的数。


[ 本帖最后由 pusofalse 于 2008-9-20 22:03 编辑 ]
作者: lovelymorning    时间: 2008-9-21 16:19

版主就是强大,啥时候才能有版主这样的水平呢,唉……

如果指定了一个环境变量名称,但未在当前环境中定义,那么值将被定为零

请教一下版主上面这一句

我用

set /a n=1+2+3+a

按照它说的,可以不用 % 将 变量 a 引起来,而上面那句说了

如果指定了一个环境变量名称,但未在当前环境中定义,那么值将被定为零

上面这一个, %a%  没有被定义,按照上面这一句,%a% 应该是 0 啊,怎么还是报错呢?

set a=
set /a n=1+2+3+a

就正确

是否上面那句说的,没有被定义是指,设置了这个变量,但没有给这个变量赋值就被set认为是 0 呢?
作者: Batcher    时间: 2008-9-21 17:13     标题: 回复 21楼 的帖子

哪里报错了?
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Test>set /a n=1+2+3+a
6
C:\Test>set a=

C:\Test>set /a n=1+2+3+a
6

作者: namejm    时间: 2008-9-21 17:22

第七题:用 random 产生一个数,然后计算它的所有位数的相加和

  可以这样:
  1. @echo off
  2. set str=%random%
  3. echo 随机数为 %str%
  4. setlocal enabledelayedexpansion
  5. for /l %%i in (0,1,9) do set str=!str:%%i=+%%i!
  6. set /a sum=%str%
  7. echo 每个数值相加的和为 %str:~1%=%sum%
  8. pause
复制代码

作者: batman    时间: 2008-9-22 19:54

前面写的第五题的解还是感觉存在效率上的问题,特给出本人的解如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (0,1,100) do set "_!random!!random!!random!=%%i"
  3. for /f "tokens=2 delims==" %%i in ('set _') do (
  4.      set /a n+=1
  5.      if !n! neq 91 (
  6.         echo %%i
  7.         ) else (
  8.        pause>nul&goto :eof
  9.     )
  10. )
复制代码

作者: batman    时间: 2008-9-22 20:10

以本人所见上面所有关于七题的解都不是精确的(可能说得有点大),本人的解如下:
  1. @echo off
  2. set "str=%random%"
  3. echo 产生的随机数为%str%
  4. :lp
  5. set /a num+=%str:~,1%&set "str=%str:~1%"
  6. if defined str goto lp
  7. echo 其各位上的数相加的和为%num%&pause>nul
复制代码

[ 本帖最后由 batman 于 2008-9-22 20:13 编辑 ]
作者: batman    时间: 2008-9-23 08:13

第八题:
  随机产生一个各位数不为0的两位数如56,并将十位数字做为行数,将个位数字做为列
数,则在屏幕上输出5行以>为分隔符6列且每列均为原随机数的字符,示例如下:
  1. 56>56>56>56>56>56    1行
  2. 56>56>56>56>56>56    2行
  3. ............. 
  4. 56>56>56>56>56>56    5行
复制代码

[ 本帖最后由 batman 于 2008-9-23 08:16 编辑 ]
作者: abab    时间: 2008-9-23 21:16

  1. @echo off
  2. set /a h=%random%%%9+1,l=%random%%%9+1
  3. for /l %%i in (1 1 %h%) do (
  4.    for /l %%j in (1 1 %l%) do set /p=%h%%l%^><NUL
  5.     set /p= <NUL&ECHO.
  6. )
  7. pause>nul
复制代码

作者: batman    时间: 2008-9-24 07:59

楼上兄弟的解简直就和我的一模一样,一样是用的分位随机,一样是用的退格,呵呵。

[ 本帖最后由 batman 于 2008-9-24 08:00 编辑 ]
作者: wxcute    时间: 2008-10-2 17:53     标题: 难的题目能不能发?讨论下排列组合问题吧

可能会比较难点,应该换个题目开个新帖子了。
4个数中取3个数的组合

排列可能更难
作者: pusofalse    时间: 2008-10-2 18:12

排列组合的问题:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "var=a b c"
  3. for %%a in (%var%) do (
  4.       set "var1=!var:%%a=!"
  5.       for %%b in (!var1!) do (
  6.             set "var2=!var1:%%b=!"
  7.             for %%c in (!var2!) do (
  8.                   echo %%a %%b %%c
  9. )))
  10. pause
复制代码
关于求组合,这是最经常用到的方法,但不通用。
但细心则能发现其中的规律。
每行基本上都是一样的,变化的只有字符串常量%%b %%c %%d ....与!var1! !var2! !var3!...知道了这个规律,能否写出一个通用的呢~
以上,BATMAN版主的思路。
作者: sjzong    时间: 2009-5-13 00:10     标题: 我也出个题目:

第十题:假设有数列有规律排列如下:
列数    1   2   3   4   5   6    7   8   9  10   行数
        0   1   2   3   4    5    6   7   8   9    1行
       10 11 12 13 14 15 16 17 18 19   2行
       ………………………………
       80 81 82 83 84 85 86 87 88 89   9行
       90 91 92 93 94 95 96 97 98 99   10行

程序:随即产生一个(0~99)的数,判断它的行数跟列数。
作者: 随风    时间: 2009-5-13 01:36

答第十题
若没有重复数字可以这样
:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a n=!random!%%100,s=0
  3. for /f "tokens=1* delims=:" %%a in ('findstr /n "\<%n%\>" b.txt') do (
  4.    echo %%b
  5.    for %%i in (%%b) do (
  6.       set /a s+=1
  7.   if %%i equ %n% set /a i=s,h=%%a
  8. )
  9. )
  10. echo %N% 在第 %h% 行, 第 %i% 列
  11. pause
复制代码
.
第十一题:
扩展31楼第十题的要求,即:a.txt中有重复的数字出现
要求同上,但必须把重复的也显示出来
比如:  25分别在第3行第2列 和 第8行第7列
.
结果显示
25 在第3行第2列
25 在第8行第7列


.
作者: netbenton    时间: 2009-5-13 07:44     标题: RE 11题

按32楼的方法,把判断和显示合并为一行就可以实现了:

if %%i equ %n% set /a i=s,h=%%a&echo %N% 在第 !h! 行, 第 !i! 列
作者: yangsl1988    时间: 2009-12-16 17:02     标题: 回复 4楼 的帖子

不知对不对?
@echo off
:sen
set /a k+=5,n=2*k
if %n% lss 100 (echo %n%&goto sen) else (pause>nul)
作者: a590687    时间: 2010-1-8 11:02     标题: 回31楼

  1. @echo off
  2. :lp
  3. set /a "a=%random% %%100"
  4. set /a "b=%a:~,1%+1"
  5. set /a "c=%a:~1,1%+1"
  6. set/p=随机数%a%在%b%行,%c%列.
  7. echo.
  8. goto lp
复制代码
我出一题:
搜索电脑里的视频文件
要求是 遍历全盘搜索rmvb;avi;mp4为后缀名的视频文件.包括隐藏文件.
搜索关键字"XX.XXX可以自行增加.

[ 本帖最后由 a590687 于 2010-1-13 09:14 编辑 ]
作者: yangfengoo    时间: 2010-1-12 11:57

re 35
  1. @echo off
  2. echo 搜索全盘需要时间……
  3. for /f "skip=1" %%i in ('wmic logicaldisk where "drivetype=3" get caption') do (
  4.   dir /b/s/a "%%i\*.rmvb";"%%i\*.avi";"%%i\*.mp4" | findstr /i "一 东 妹 同 户 护 漂"
  5. )
  6. pause
复制代码
出题,对找到的片进行简单加密处理,方法自选。
需要时运行P输入密码解密

汗。关键词。

[ 本帖最后由 yangfengoo 于 2010-1-13 14:05 编辑 ]
作者: a590687    时间: 2010-1-13 09:16     标题: re36的兄弟

由于一些原因,题目改变,请把关键词 换成XX.XXX 适当.

不要关键字 把所有视频>a.txt 也很直观的说~

[ 本帖最后由 a590687 于 2010-1-13 09:18 编辑 ]




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2