标题: 批处理一问一答,问为重 [打印本页]
作者: wxcute 时间: 2008-9-17 22:01 标题: 批处理一问一答,问为重
n层:我问一个问题 //当然问题要清楚,不要改来改去
n+1层:这层回答问题,并提出一个新问题 //最好提出新问题
n+2层:如果上一层没有提出新问题,则这层必须提出一新问题 //可回答n层的问题,也可只提新问题
先来个:
列出100以内的素数
质数(又称为素数)
在所有比1大的整数中,除了1和它本身以外,不再有别的约数,这种整数叫做质数。
作者: pusofalse 时间: 2008-9-17 22:40
这个方法好啊~以游戏的方式.
为支持楼主,我先来解第一道题吧。- @echo off&setlocal enabledelayedexpansion
- echo 2
- for /l %%a in (3 2 100) do set/a n=2,m=%%a&call :lp %%a
- pause>nul&exit/b
- :lp
- set/a mod=m%%n
- if %mod% equ 0 (
- set "res=%res%%n%*"
- set/a m/=n
- goto lp
- ) else (
- set/a n+=1
- if !n! leq !m! goto lp
- )
- if "!res:~,-1!" equ "%1" echo !res:~,-1!
- set "res="
复制代码
效率不怎么样,因为是先分解出每个数的质因数,最后再作比较,期待好的方案。
昨晚思维定向的厉害,简化:- @echo off&setlocal enabledelayedexpansion
- echo 2
- for /l %%a in (3 2 100) do (
- set/a m=%%a-1,a=0
- for /l %%i in (2 1 !m!) do (
- set/a n=%%a%%%%i
- if !n! equ 0 set a=1
- )
- if !a! equ 0 echo %%a
- )
- pause
复制代码
第2题:
列出100以内所有能被3整除的偶数。
[ 本帖最后由 pusofalse 于 2008-9-18 02:50 编辑 ]
作者: batman 时间: 2008-9-18 10:57
这种学习的思路妙,我来解第二题:- @echo off
- :begin
- set /a n+=2,m=n*3
- if %m% lss 100 (
- echo %m%&goto begin
- ) else (
- pause>nul
- )
复制代码
同时,本人给出第三题:
列出1-100内所有大于23小于90且能被5整除的偶数(比较容易哦)
作者: lovelymorning 时间: 2008-9-18 16:53
- @echo off
- setlocal enabledelayedexpansion
- for /l %%i in (24,1,89) do (
- set a=%%i
- if "!a:~-1!"=="0" echo %%i
- )
- 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是自然数也是偶数,奇怪)
测试代码:- @echo off
- for /l %%i in (0 10 100) do echo 100以内能被2和5整除的数有: %%i
- pause>nul
复制代码
第五题:产生90个0-100间的不重复的随机数字
作者: lovelymorning 时间: 2008-9-18 21:33
献丑了。。。- @echo off&set n=1
- :st
- set /a w=%random%%%100
- if not defined %w% (
- if "%n%" LEQ "90" (
- echo %w%
- set w=ok
- set /a n+=1
- goto st
- )
- )
- pause
复制代码
代码还是有待提高。。。
暂时想不到要问什么问题,等待楼下出题。。Sorry!
PS:真想不透现在的课本,乍就这样呢,当时读的时候,0 可不是自然数啊
[ 本帖最后由 lovelymorning 于 2008-9-19 13:18 编辑 ]
作者: wxcute 时间: 2008-9-19 21:44
9楼代码有问题,因为%w%是一直not defined的,所以运行结果是可能会有重复的
改成如下:- @echo off
- :lp
- set/a n=%random%%%100
- if not defined _%n% (
- set _%n%=%n%
- echo %n%
- set/a num+=1
- )
- if not %num% gtr 90 goto :lp
- pause
复制代码
第六题:产生一个三位的随机数,并计算各位数字相加的和
(如:产生的随机数是123,和为1+2+3=6)(不难吧)
作者: lovelymorning 时间: 2008-9-19 22:52
晕,漏了 set %w%=ok 百分号了,无语- @echo off
- set n=1
- :st
- set /a w=%random%%%100
- if not defined %w% (
- if "%n%" LEQ "90" (
- echo %w%
- set %w%=ok
- set /a n+=1
- goto st
- )
- ) else goto st
- pause
复制代码
这个,不知行不
原先那个,我测试了好几次,都没出现重复,难道是RP较好?
这个,应该不会了吧?
作者: lovelymorning 时间: 2008-9-19 22:58
回第六题:- @echo off
- set /a n=%random%%%999+100
- echo %n%
- set /a h=%n:~0,1%+%n:~1,1%+%n:~-1%
- echo %h%
- 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个数
正确的解法可以是如下:- @echo off
- :lp
- cls
- set /a n=%random%%%900+100
- echo %n%
- set /a h=%n:~0,1%+%n:~1,1%+%n:~-1%
- echo %h%
- pause
- goto :lp
复制代码
大家还是回答第七个吧!
作者: lovelymorning 时间: 2008-9-20 20:41
第七题:- @echo off
- set h=%RANDOM%
- echo %h%
- set /a zh=%h:~0,1%+%h:~1,1%+%h:~2,1%+%h:~3,1%+%h:~4,1%
- echo %zh%
- 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来判断:
- @echo off&setlocal enabledelayedexpansion
- set h=!random!!random!!random!!random!
- for /l %%a in (0 1 10000) do (
- if "!h:~%%a,1!" neq "" (
- set/a zh+=!h:~%%a,1!
- ) else (
- echo !zh!
- pause&exit/b
- ))
复制代码
以上代码,假设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 产生一个数,然后计算它的所有位数的相加和
可以这样:
- @echo off
- set str=%random%
- echo 随机数为 %str%
- setlocal enabledelayedexpansion
- for /l %%i in (0,1,9) do set str=!str:%%i=+%%i!
- set /a sum=%str%
- echo 每个数值相加的和为 %str:~1%=%sum%
- pause
复制代码
作者: batman 时间: 2008-9-22 19:54
前面写的第五题的解还是感觉存在效率上的问题,特给出本人的解如下:
- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (0,1,100) do set "_!random!!random!!random!=%%i"
- for /f "tokens=2 delims==" %%i in ('set _') do (
- set /a n+=1
- if !n! neq 91 (
- echo %%i
- ) else (
- pause>nul&goto :eof
- )
- )
复制代码
作者: batman 时间: 2008-9-22 20:10
以本人所见上面所有关于七题的解都不是精确的(可能说得有点大),本人的解如下:- @echo off
- set "str=%random%"
- echo 产生的随机数为%str%
- :lp
- set /a num+=%str:~,1%&set "str=%str:~1%"
- if defined str goto lp
- echo 其各位上的数相加的和为%num%&pause>nul
复制代码
[ 本帖最后由 batman 于 2008-9-22 20:13 编辑 ]
作者: batman 时间: 2008-9-23 08:13
第八题:
随机产生一个各位数不为0的两位数如56,并将十位数字做为行数,将个位数字做为列
数,则在屏幕上输出5行以>为分隔符6列且每列均为原随机数的字符,示例如下:
- 56>56>56>56>56>56 1行
- 56>56>56>56>56>56 2行
- .............
- 56>56>56>56>56>56 5行
复制代码
[ 本帖最后由 batman 于 2008-9-23 08:16 编辑 ]
作者: abab 时间: 2008-9-23 21:16
- @echo off
- set /a h=%random%%%9+1,l=%random%%%9+1
- for /l %%i in (1 1 %h%) do (
- for /l %%j in (1 1 %l%) do set /p=%h%%l%^><NUL
- set /p= <NUL&ECHO.
- )
- pause>nul
复制代码
作者: batman 时间: 2008-9-24 07:59
楼上兄弟的解简直就和我的一模一样,一样是用的分位随机,一样是用的退格,呵呵。
[ 本帖最后由 batman 于 2008-9-24 08:00 编辑 ]
作者: wxcute 时间: 2008-10-2 17:53 标题: 难的题目能不能发?讨论下排列组合问题吧
可能会比较难点,应该换个题目开个新帖子了。
排列可能更难
作者: pusofalse 时间: 2008-10-2 18:12
排列组合的问题:- @echo off&setlocal enabledelayedexpansion
- set "var=a b c"
- for %%a in (%var%) do (
- set "var1=!var:%%a=!"
- for %%b in (!var1!) do (
- set "var2=!var1:%%b=!"
- for %%c in (!var2!) do (
- echo %%a %%b %%c
- )))
- 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
答第十题
若没有重复数字可以这样
:- @echo off&setlocal enabledelayedexpansion
- set /a n=!random!%%100,s=0
- for /f "tokens=1* delims=:" %%a in ('findstr /n "\<%n%\>" b.txt') do (
- echo %%b
- for %%i in (%%b) do (
- set /a s+=1
- if %%i equ %n% set /a i=s,h=%%a
- )
- )
- echo %N% 在第 %h% 行, 第 %i% 列
- 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楼
- @echo off
- :lp
- set /a "a=%random% %%100"
- set /a "b=%a:~,1%+1"
- set /a "c=%a:~1,1%+1"
- set/p=随机数%a%在%b%行,%c%列.
- echo.
- goto lp
复制代码
我出一题:
搜索电脑里的视频文件
要求是 遍历全盘搜索rmvb;avi;mp4为后缀名的视频文件.包括隐藏文件.
搜索关键字"XX.XXX可以自行增加.
[ 本帖最后由 a590687 于 2010-1-13 09:14 编辑 ]
作者: yangfengoo 时间: 2010-1-12 11:57
re 35- @echo off
- echo 搜索全盘需要时间……
- for /f "skip=1" %%i in ('wmic logicaldisk where "drivetype=3" get caption') do (
- dir /b/s/a "%%i\*.rmvb";"%%i\*.avi";"%%i\*.mp4" | findstr /i "一 东 妹 同 户 护 漂"
- )
- 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://bathome.net./) |
Powered by Discuz! 7.2 |