标题: [其他] 批处理如何判断一个十位数字中的数字是否有重复 [打印本页]
作者: ieutk 时间: 2008-1-13 01:32 标题: 批处理如何判断一个十位数字中的数字是否有重复
本帖最后由 pcl_test 于 2016-7-25 19:35 编辑
有一个数,有10位,这个10位数是由0-9组成
不知有什么好的方法去判断它?
我想了好久也只知一个判断它的每一位出现次数
作者: 随风 时间: 2008-1-13 02:10
你要判断什么?
作者: ieutk 时间: 2008-1-13 11:17
就是这个10位数是由0-9这十个数字组成,0-9中的每个数字不能有重复,有什么好的方法?
作者: youxi01 时间: 2008-1-13 11:38
用if defined很容易做到
但是代码的效率和健壮性都不够高
作者: youxi01 时间: 2008-1-13 12:30
写一个不用if检测的测试代码:- @echo off & setlocal enabledelayedexpansion
- for /l %%i in (0 1 9) do set num%%i=%%i
- :start
- set "str="
- for /l %%i in (0 1 9) do (
- set /a rnd=!random:~-1!,var=!num%%i!
- call set num%%i=%%num!rnd!%%
- set num!rnd!=!var!
- )
- for /l %%i in (0 1 9) do set str=!str!!num%%i!
-
- set /a Fnum=%str:~0,1%
- set /a 1/%Fnum% 2>nul||goto :start
- echo 10位随机数为:!str!
- echo.&echo 按任意键获得下个随机数
- pause>nul
- goto :start
复制代码
作者: 随风 时间: 2008-1-13 14:36
不错,youxi 看来是深受联盟的影响,极其讨厌if,
个人认为if应该是内部命令,不会对效率有太大影响吧?
来几个我的代码:
判断10位数字是否重复的方法。
方法一、
0-9 的总和是45,利用这个来判断
:- @echo off
- set var=4230195678
- echo %var%&echo.
- for /l %%i in (0 1 9) do call set var=%%var:%%i=%%i =%%
- for %%a in (%var%) do set /a num+=%%a
- if %num% equ 45 (echo 没有重复的数字) else echo 有重复的数字
- pause>nul
复制代码
方法二、
将每位数都定义为变量,通过defined来判断是否重复。
:- @echo off
- set var=2230195678
- echo %var%&echo.
- :lis
- if not defined _%var:~0,1% (set _%var:~0,1%=a) else set jie=a
- set var=%var:~1%
- if defined var goto lis
- if not defined jie (echo 没有重复的数字) else echo 有重复的数字
- pause
复制代码
获取10位不重复的随机数
方法一、
虽然用了if判断,但是整个流程for只需循环10次,且用的是递归调用,效率应该也算快的
- @echo off
- :start
- set "var=0 1 2 3 4 5 6 7 8 9 "
- set su=10
- setlocal enabledelayedexpansion
- call :lis "!var!"
- echo.&echo 10位随机数为:!str!
- echo.&echo 按任意键获得下个随机数
- pause>nul
- endlocal
- goto :start
- :lis
- set /a w=!random!%%!su!+1
- for %%i in (%~1) do (
- set /a num+=1
- if !num! equ !w! (
- set str=!str!%%i
- set var=!var:%%i =!
- set /a su-=1,num=0
- if defined var call :lis "!var!"
- goto :eof
- ))
- goto :eof
复制代码
[ 本帖最后由 随风 于 2008-1-13 14:52 编辑 ]
作者: youxi01 时间: 2008-1-13 15:17
利用和来检测数字是否重复是不太准确的:- @echo off
- set var=4230195678
- echo %var%&echo.
- for /l %%i in (0 1 9) do call set var=%%var:%%i=%%i =%%
- for %%a in (%var%) do set /a num+=%%a
- if %num% equ 45 (echo 没有重复的数字) else echo 有重复的数字
- pause>nul
复制代码
0+1+2+....+9=45固然没错,
但是:0+0+1+4+5+5+6+7+8+9=45
要是重复成 第二个式子 的类型,是不是会出现错误判断呢?!
作者: youxi01 时间: 2008-1-13 15:19
这段代码还有点点瑕疵:- @echo off
- :start
- set "var=0 1 2 3 4 5 6 7 8 9 "
- set su=10
- setlocal enabledelayedexpansion
- call :lis "!var!"
- echo.&echo 10位随机数为:!str!
- echo.&echo 按任意键获得下个随机数
- pause>nul
- endlocal
- goto :start
- :lis
- set /a w=!random!%%!su!+1
- for %%i in (%~1) do (
- set /a num+=1
- if !num! equ !w! (
- set str=!str!%%i
- set var=!var:%%i =!
- set /a su-=1,num=0
- if defined var call :lis "!var!"
- goto :eof
- ))
- goto :eof
复制代码
没有排除第一个为0的数字
作者: 随风 时间: 2008-1-13 15:23
哈哈,
我考虑的太不周到了,错误多多啊,呵呵。。。。
作者: 随风 时间: 2008-1-13 16:01
修正首位为0时的错误。
:- @echo off
- :start
- set "var=0 1 2 3 4 5 6 7 8 9 "
- set /a su=9
- setlocal enabledelayedexpansion
- set /a str=!random!%%9+1
- set var=!var:%str% =!
- call :lis "!var!"
- echo.&echo 10位随机数为:!str!
- echo.&echo 按任意键获得下个随机数
- pause>nul
- endlocal
- goto :start
- :lis
- set /a w=!random!%%!su!+1
- for %%i in (%~1) do (
- set /a num+=1
- if !num! equ !w! (
- set str=!str!%%i
- set var=!var:%%i =!
- set /a su-=1,num=0
- if defined var call :lis "!var!"
- goto :eof
- ))
- goto :eof
复制代码
[ 本帖最后由 随风 于 2008-1-13 16:07 编辑 ]
作者: ieutk 时间: 2008-1-13 20:43
一口气加了那么多分,呵呵,两位厉害呀,佩服
作者: pcl_test 时间: 2016-11-12 16:25
- @echo off&setlocal enabledelayedexpansion
- set str=1234567
- if not defined str echo;null&goto end
- for /f "tokens=1*delims=0123456789" %%a in ("%str%") do if "%%a%%b" neq "" echo;含非数字&goto end
- if "%str:~10,1%" neq "" echo;Y&goto end
- set len=%str%a9876543210&set/an=0x!len:~10,1!
- for /l %%a in (0 1 9) do (
- set len=!str:%%a=!a9876543210&set/am=0x!len:~10,1!
- set/at=n-m&if !t! gtr 1 (echo;Y&goto end)
- )
- echo;N
- :end
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |