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

批处理一问一答,问为重

[复制链接]
发表于 2008-9-20 18:09:16 | 显示全部楼层
直接取1000不可以吗?还有12楼的问题好象跟10楼的差不多啊~~
发表于 2008-9-20 19:23:26 | 显示全部楼层

回复 16楼 的帖子

要求是3位数之间的,取余1000的话会包含2位数。
 楼主| 发表于 2008-9-20 19:38:57 | 显示全部楼层
第六个可能是大家计算多一个少一个的没算清楚
举例: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
复制代码
大家还是回答第七个吧!
发表于 2008-9-20 20:41:56 | 显示全部楼层
第七题:
  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 位数,那这些变量都存在,也就可以正常相加了

又是一次投机取巧。。。
发表于 2008-9-20 21:44:50 | 显示全部楼层
这种写法有误,你漏掉了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 编辑 ]
发表于 2008-9-21 16:19:51 | 显示全部楼层
版主就是强大,啥时候才能有版主这样的水平呢,唉……

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

请教一下版主上面这一句

我用

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

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

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

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

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

就正确

是否上面那句说的,没有被定义是指,设置了这个变量,但没有给这个变量赋值就被set认为是 0 呢?
发表于 2008-9-21 17:13: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
发表于 2008-9-21 17:22:33 | 显示全部楼层
第七题:用 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
复制代码

评分

参与人数 2PB +9 收起 理由
sjzong + 5 思路巧妙,值得收藏学习
youxi01 + 4 方法很巧啊!

查看全部评分

发表于 2008-9-22 19:54:28 | 显示全部楼层
前面写的第五题的解还是感觉存在效率上的问题,特给出本人的解如下:
  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. )
复制代码

评分

参与人数 1PB +5 收起 理由
sjzong + 5 batman兄的代码,用“_!random!!random!!ra ...

查看全部评分

发表于 2008-9-22 20:10:07 | 显示全部楼层
以本人所见上面所有关于七题的解都不是精确的(可能说得有点大),本人的解如下:
  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 编辑 ]
发表于 2008-9-23 08:13:48 | 显示全部楼层
第八题:
  随机产生一个各位数不为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 编辑 ]
发表于 2008-9-23 21:16:02 | 显示全部楼层
  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
复制代码

评分

参与人数 2PB +12 收起 理由
wxcute + 8
pusofalse + 4

查看全部评分

发表于 2008-9-24 07:59:06 | 显示全部楼层
楼上兄弟的解简直就和我的一模一样,一样是用的分位随机,一样是用的退格,呵呵。

[ 本帖最后由 batman 于 2008-9-24 08:00 编辑 ]
 楼主| 发表于 2008-10-2 17:53:37 | 显示全部楼层

难的题目能不能发?讨论下排列组合问题吧

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

排列可能更难
发表于 2008-10-2 18:12:28 | 显示全部楼层
排列组合的问题:
  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版主的思路。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 00:55 , Processed in 0.024277 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表