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

[其他] 批处理如何判断一个十位数字中的数字是否有重复

本帖最后由 pcl_test 于 2016-7-25 19:35 编辑

有一个数,有10位,这个10位数是由0-9组成

  不知有什么好的方法去判断它?

  我想了好久也只知一个判断它的每一位出现次数
不大可能的事也许今天实现,根本不可能的事也许明天会实现

你要判断什么?
技术问题请到论坛发帖求助!

TOP

就是这个10位数是由0-9这十个数字组成,0-9中的每个数字不能有重复,有什么好的方法?
不大可能的事也许今天实现,根本不可能的事也许明天会实现

TOP

用if defined很容易做到
但是代码的效率和健壮性都不够高

TOP

写一个不用if检测的测试代码:
  1. @echo off & setlocal enabledelayedexpansion
  2. for /l %%i in (0 1 9) do set num%%i=%%i
  3. :start
  4. set "str="
  5. for /l %%i in (0 1 9) do (
  6.     set /a rnd=!random:~-1!,var=!num%%i!
  7.     call set num%%i=%%num!rnd!%%
  8.     set num!rnd!=!var!
  9. )
  10. for /l %%i in (0 1 9) do set str=!str!!num%%i!
  11. set /a Fnum=%str:~0,1%
  12. set /a 1/%Fnum% 2>nul||goto :start
  13. echo 10位随机数为:!str!
  14. echo.&echo 按任意键获得下个随机数
  15. pause>nul
  16. goto :start
复制代码
2

评分人数

TOP

不错,youxi 看来是深受联盟的影响,极其讨厌if,
个人认为if应该是内部命令,不会对效率有太大影响吧?
来几个我的代码:
判断10位数字是否重复的方法。
方法一、
0-9 的总和是45,利用这个来判断
:
  1. @echo off
  2. set var=4230195678
  3. echo %var%&echo.
  4. for /l %%i in (0 1 9) do call set var=%%var:%%i=%%i =%%
  5. for %%a in (%var%) do set /a num+=%%a
  6. if %num% equ 45 (echo 没有重复的数字) else echo 有重复的数字
  7. pause>nul
复制代码

方法二、
将每位数都定义为变量,通过defined来判断是否重复。
:
  1. @echo off
  2. set var=2230195678
  3. echo %var%&echo.
  4. :lis
  5. if not defined _%var:~0,1% (set _%var:~0,1%=a) else set jie=a
  6. set var=%var:~1%
  7. if defined var goto lis
  8. if not defined jie (echo 没有重复的数字) else echo 有重复的数字
  9. pause
复制代码


获取10位不重复的随机数
方法一、
虽然用了if判断,但是整个流程for只需循环10次,且用的是递归调用,效率应该也算快的
  1. @echo off
  2. :start
  3. set "var=0 1 2 3 4 5 6 7 8 9 "
  4. set su=10
  5. setlocal enabledelayedexpansion
  6. call :lis "!var!"
  7. echo.&echo 10位随机数为:!str!
  8. echo.&echo 按任意键获得下个随机数
  9. pause>nul
  10. endlocal
  11. goto :start
  12. :lis
  13. set /a w=!random!%%!su!+1
  14. for %%i in (%~1) do (
  15.   set /a num+=1
  16.   if !num! equ !w! (
  17.   set str=!str!%%i
  18.   set var=!var:%%i =!
  19.   set /a su-=1,num=0
  20.   if defined var call :lis "!var!"
  21.   goto :eof
  22. ))
  23. goto :eof
复制代码

[ 本帖最后由 随风 于 2008-1-13 14:52 编辑 ]
1

评分人数

技术问题请到论坛发帖求助!

TOP

利用和来检测数字是否重复是不太准确的:
  1. @echo off
  2. set var=4230195678
  3. echo %var%&echo.
  4. for /l %%i in (0 1 9) do call set var=%%var:%%i=%%i =%%
  5. for %%a in (%var%) do set /a num+=%%a
  6. if %num% equ 45 (echo 没有重复的数字) else echo 有重复的数字
  7. pause>nul
复制代码
0+1+2+....+9=45固然没错,
但是:0+0+1+4+5+5+6+7+8+9=45
要是重复成 第二个式子 的类型,是不是会出现错误判断呢?!

TOP

这段代码还有点点瑕疵:
  1. @echo off
  2. :start
  3. set "var=0 1 2 3 4 5 6 7 8 9 "
  4. set su=10
  5. setlocal enabledelayedexpansion
  6. call :lis "!var!"
  7. echo.&echo 10位随机数为:!str!
  8. echo.&echo 按任意键获得下个随机数
  9. pause>nul
  10. endlocal
  11. goto :start
  12. :lis
  13. set /a w=!random!%%!su!+1
  14. for %%i in (%~1) do (
  15.   set /a num+=1
  16.   if !num! equ !w! (
  17.   set str=!str!%%i
  18.   set var=!var:%%i =!
  19.   set /a su-=1,num=0
  20.   if defined var call :lis "!var!"
  21.   goto :eof
  22. ))
  23. goto :eof
复制代码
没有排除第一个为0的数字
1

评分人数

TOP

哈哈,
我考虑的太不周到了,错误多多啊,呵呵。。。。
技术问题请到论坛发帖求助!

TOP

修正首位为0时的错误。
:
  1. @echo off
  2. :start
  3. set "var=0 1 2 3 4 5 6 7 8 9 "
  4. set /a su=9
  5. setlocal enabledelayedexpansion
  6. set /a str=!random!%%9+1
  7. set var=!var:%str% =!
  8. call :lis "!var!"
  9. echo.&echo 10位随机数为:!str!
  10. echo.&echo 按任意键获得下个随机数
  11. pause>nul
  12. endlocal
  13. goto :start
  14. :lis
  15. set /a w=!random!%%!su!+1
  16. for %%i in (%~1) do (
  17.   set /a num+=1
  18.   if !num! equ !w! (
  19.   set str=!str!%%i
  20.   set var=!var:%%i =!
  21.   set /a su-=1,num=0
  22.   if defined var call :lis "!var!"
  23.   goto :eof
  24. ))
  25. goto :eof
复制代码

[ 本帖最后由 随风 于 2008-1-13 16:07 编辑 ]
1

评分人数

技术问题请到论坛发帖求助!

TOP

一口气加了那么多分,呵呵,两位厉害呀,佩服
不大可能的事也许今天实现,根本不可能的事也许明天会实现

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set str=1234567
  3. if not defined str echo;null&goto end
  4. for /f "tokens=1*delims=0123456789" %%a in ("%str%") do if "%%a%%b" neq "" echo;含非数字&goto end
  5. if "%str:~10,1%" neq "" echo;Y&goto end
  6. set len=%str%a9876543210&set/an=0x!len:~10,1!
  7. for /l %%a in (0 1 9) do (
  8.     set len=!str:%%a=!a9876543210&set/am=0x!len:~10,1!
  9.     set/at=n-m&if !t! gtr 1 (echo;Y&goto end)
  10. )
  11. echo;N
  12. :end
  13. pause
复制代码

TOP

返回列表