[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
直接取1000不可以吗?还有12楼的问题好象跟10楼的差不多啊~~

TOP

回复 16楼 的帖子

要求是3位数之间的,取余1000的话会包含2位数。
心绪平和,眼藏静谧。

TOP

第六个可能是大家计算多一个少一个的没算清楚
举例: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
复制代码
大家还是回答第七个吧!

TOP

第七题:
  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 位数,那这些变量都存在,也就可以正常相加了

又是一次投机取巧。。。

TOP

这种写法有误,你漏掉了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 编辑 ]
心绪平和,眼藏静谧。

TOP

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

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

请教一下版主上面这一句

我用

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

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

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

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

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

就正确

是否上面那句说的,没有被定义是指,设置了这个变量,但没有给这个变量赋值就被set认为是 0 呢?

TOP

回复 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
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

第七题:用 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
复制代码
2

评分人数

    • sjzong: 思路巧妙,值得收藏学习PB + 5
    • youxi01: 方法很巧啊!PB + 4
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

前面写的第五题的解还是感觉存在效率上的问题,特给出本人的解如下:
  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. )
复制代码
1

评分人数

    • sjzong: batman兄的代码,用“_!random!!random!!ra ...PB + 5
***共同提高***

TOP

以本人所见上面所有关于七题的解都不是精确的(可能说得有点大),本人的解如下:
  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 编辑 ]
***共同提高***

TOP

第八题:
  随机产生一个各位数不为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 编辑 ]
***共同提高***

TOP

  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
复制代码
2

评分人数

TOP

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

[ 本帖最后由 batman 于 2008-9-24 08:00 编辑 ]
***共同提高***

TOP

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

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

排列可能更难

TOP

排列组合的问题:
  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版主的思路。
心绪平和,眼藏静谧。

TOP

返回列表