
标题: [出题]批处理随机字符串中判断数字组合成的值 [打印本页]
作者: HAT 时间: 2008-8-19 23:34 标题: [出题]批处理随机字符串中判断数字组合成的值
很久没有人出题了,我来试着出一个:
随机产生一个30位的字母+数字的混合字符串,判断其中的数字顺序组合而成的值和123456789012345的关系(大于/等于/小于)。
比如随机产生的字符串为40da54klapwat8acaar4m805op5a161
就判断数字4054848055161和123456789012345的关系(大于/等于/小于)。
===============================================
解决方案见2楼、5楼、9楼、17、20楼。个人比较推荐用sort来比较大小,简洁、可读性好。
[ Last edited by HAT on 2008-8-30 at 11:21 AM ]
作者: 523066680 时间: 2008-8-20 08:50
哈 hat大哥出题啦
来一个偏方CODE: [Copy to clipboard]
@echo off
setlocal enabledelayedexpansion
for /l %%a in (0,1,9) do set n%%a=%%a
set /a x=9,a=0
for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
set /a x+=1
set n!x!=%%a
)
set xx=2
:a
set /a a+=1
set /a ran=%random:~%%%36
set ran=!n%ran%!
if %ran% geq 0 (if %ran% leq 9 (set num=!num!%ran%&set /a xx+=1))
set hang=%hang%%ran%
if %a% lss 30 goto :a
echo,%hang%
echo,数字为 %num%
if "%num%"=="123456789012345" (echo,%num%等于123456789012345) else (call :next)
pause
exit
:next
((echo,%num% &echo,123456789012345)|sort /+%xx%|more +1)>xXx.x
set /p final=<xXx.x
del xXx.x
if "%final: =%"=="123456789012345" (echo,%num% 小于 123456789012345) else (
echo,%num% 大于 123456789012345)
[ Last edited by 523066680 on 2008-8-20 at 03:20 PM ]
作者: HAT 时间: 2008-8-20 10:09
能否判断小于和等于?
作者: 523066680 时间: 2008-8-20 10:10
哈哈 你的题目是------是否大于
要的话你也要改改题目哦
回头一看 已经改了……
改好了
[ Last edited by 523066680 on 2008-8-20 at 10:22 AM ]
作者: pusofalse 时间: 2008-8-20 10:11 标题: 只是比较位数。
CODE: [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set "str=abcdefghijklmnopqrstuvwxyz0123456789"
:loop
set/a n=%random%%%36,x+=1
call,set "var=%var%%%str:~%n%,1%%"
if %x% neq 30 goto loop
if "%var:~,1%" equ "0" set/a n=%random%%%9+1&set var=!n!%var%
echo %var%
for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do call set "var=%%var:%%a=%%"
if "%var%" equ "123456789012345" echo %var% 等于 123456789012345&pause>nul&exit/b
for /l %%i in (0 1 30) do if "!var:~%%i,1!" equ "" set "length=%%i"&goto :next
:next
if %length% lss 15 (
echo %var% 小于 123456789012345
) else (
if %length% equ 15 (
for /f %%a in ('^(echo %var%^&echo 123456789012345^)^|sort') do set num=%%a
if !num! equ 123456789012345 (echo %var% 小于 !num!) else echo %var% 大于!num!
) else (
if %length% gtr 15 echo %var% 大于 123456789012345
)
)
pause
[ Last edited by pusofalse on 2008-8-20 at 10:25 AM ]
作者: bat-zw 时间: 2008-8-20 10:30
此题出得好,先不解答,看看大家的吧。。。
作者: flyinspace 时间: 2008-8-20 10:53
其实,此题的重点是比较。随机生成数字只是孱头。。
大于10位数的用 if 是比较不出结果的。
总的来说就是计算 随机值 与 1234567890123456 之间的大数减法关系。
当然,可以采用长度比较法。。只是代码也比较复杂,但计算机的开销要好很多。毕竟不需要使用大数减法了。
作者: 523066680 时间: 2008-8-20 11:02
我的2楼代码改了……思路是用sort /+15
哈哈 我的还得改改
这样真是让我不得不学下sort啊
[ Last edited by 523066680 on 2008-8-20 at 12:24 PM ]
作者: terse 时间: 2008-8-20 13:42
CODE: [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set size=123456789012345
for /l %%i in (0,1,9) do set %%i=%%i
set str=0123456789qwertyuiopasdfghjklzxcvbnm
for /l %%i in (1,1,30) do (set "var2=#!var2!"&call :lp)
echo 取得的结果是%var%
if "!var1!"=="!size!" (echo !var1! 等于 !size!&pause&exit)else (for %%i in (!var1! !size!) do set str=!var2!%%i&set #!str:~-30!=a
for /f "delims==#" %%i in ('set #') do if "%%i"=="!size!" (echo %var1% 大于 !size!&pause&exit)else echo %var1% 小于 !size!&pause&exit)
:lp
set/a ns=%random%%%36
set str1=!str:~%ns%,1!
if defined !str1! set var1=!var1!!str1!
set var=!var!!str:~%ns%,1!
作者: HAT 时间: 2008-8-20 20:43
2楼和5楼的方法综合一下,效果不错,赞!
作者: 523066680 时间: 2008-8-20 21:17
由此我个人引发了对sort的理解问题,认为如果能深入sort 应该能够为
判断--多位数字 提供更大方便, 我认为有必要研究一下用sort判断多位数字的方法
为什么这么说 我举个例子吧 我也不知道为何(按要求的sort是从小到大列)
@echo off
(echo,223&echo,123)|sort /+3
pause
--------------后者能按123 223列出--------------------
@echo off
(echo,223&echo,123)|sort /+5
pause
(规律好像是在他们之间 最大的位数+2,然后能成功判断)
我对sort不了解 希望能听到其他见解 谢谢
经过一些测试,我现在猜是这样子的,如果要用sort使长字节数字正常的 通用的 比较输出
应使sort /+[最大数的位数+2]
或者 使sort /+[最小数的位数+2]
[ Last edited by 523066680 on 2008-8-21 at 08:10 AM ]
作者: pusofalse 时间: 2008-8-20 21:21
set和sort都是按照字符串大小来排列的。
作者: flyinspace 时间: 2008-8-20 22:55
| Quote: |
Originally posted by pusofalse at 2008-8-20 09:21 PM:
set和sort都是按照字符串大小来排列的。 |
|
呵呵,不要想当然了:)仔细看看区别吧:)
作者: 523066680 时间: 2008-8-22 07:29
看下这个帖子terse前辈的解题思路。
原来可以这么直接
http://www.bathome.cn/viewthread ... &extra=page%3D1
作者: 523066680 时间: 2008-8-24 16:21
他们是用补0的 哎……偶咋没想到妮……
作者: HAT 时间: 2008-8-24 20:23 标题: Re 15楼
补0的方法论坛早就有了,没想到可能是潜水不够吧:)
作者: HAT 时间: 2008-8-25 21:38
下面是我最初的思路,比较两个数的时候用的另一个方法。CODE: [Copy to clipboard]
@echo off
setlocal enabledelayedexpansion
set std=123456789012345
set src=abcdefghijklmnopqrstuvwxyz0123456789
set count=0
:rdmnum
set /a rdm=%random%%%36
set str=!src:~%rdm%,1!!str!
set /a count+=1
if !count! lss 30 (
goto :rdmnum
)
echo 随机字符串:%str%
for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do call set str=%%str:%%a=%%
echo 提取的数字:%str%
set length=0
for /f "skip=1 delims=:" %%a in ('^(echo "%str%"^&echo.^)^|findstr /o ".*"') do set /a length=%%a-5
if %length% lss 15 (
echo 比较的结果:%str%小于%std%
) else if %length% gtr 15 (
echo 比较的结果:%str%大于%std%
) else (
set strl=%str:~0,8%
set strr=%str:~8,7%
set stdl=%std:~0,8%
set stdr=%std:~8,7%
if 1!strl! lss 1!stdl! (
echo 比较的结果:%str%小于%std%
) else if 1!strl! gtr 1!stdl! (
echo 比较的结果:%str%大于%std%
) else (
if 1!strr! lss 1!stdr! (
echo 比较的结果:%str%小于%std%
) else if 1!strr! gtr 1!stdr! (
echo 比较的结果:%str%大于%std%
) else (
echo 比较的结果:%str%等于%std%
)
)
)
作者: pusofalse 时间: 2008-8-26 00:05
提取的随机数,测试小于特定数的概率>99%,还有HAT前辈忽略了随机数首位是0的情况,虽然不影响比较。
作者: HAT 时间: 2008-8-26 00:40
7楼已经提过,随机数只是个幌子,重点在于后面的大数比较。所以不必考虑概率>99%
echo 提取的数字:%str%
在这句之前把最左边的0去掉就行了。由于后面比较的时候采取了截断并首位补1的方法,所以不会把0认为是八进制的开始,不影响比较:)
作者: bat-zw 时间: 2008-8-26 09:53 标题: 我也来一个
应用set排序原理:CODE: [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
for /l %%i in (1,1,30) do set "bw=!bw!0"
set "var=123456789012345"
set "code=0123456789abcdefghijklmnopqrstuvwxyz"
for /l %%i in (1,1,30) do (
set /a a=!random!%%36
call,set "str=!str!%%code:~!a!,1%%"
)
echo.&echo 随机生成的字符串为:%str%
for %%i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set "str=!str:%%i=!"
if "%str%" equ "%var%" echo.&echo %str%等于%var%&pause>nul&goto :eof
if "%str:~,1%" equ "0" echo.&echo %str%小于%var%&pause>nul&goto :eof
for %%i in (%str% %var%) do (
set "a=%bw%%%i"
set "_!a:~-30!=%%i"
)
for /f "tokens=2 delims==" %%i in ('set _') do set "jg=!jg!小于%%i"
echo.&echo %jg:~2%&pause>nul
[ Last edited by bat-zw on 2008-8-26 at 10:57 AM ]
作者: HAT 时间: 2008-8-26 13:55 标题: Re 20楼
假如生成的随机数是133456789012345,能否显示133456789012345大于123456789012345?
作者: bat-zw 时间: 2008-8-26 16:03
| Quote: |
Originally posted by HAT at 2008-8-26 13:55:
假如生成的随机数是133456789012345,能否显示133456789012345大于123456789012345? |
|
你的题意就是要表示生成的随机数与123456789012345的关系啊,再说这只是个处理上的问题,没必要死揪着吧。
作者: HAT 时间: 2008-8-26 16:11
误会,误会,不是死揪着,而是想请教一下能否做个简单的改动把小于变成大于。
考虑到set的特点,大于可能不好实现,想看看 bat-zw 兄有没有好的方案。
| 欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/) |
Powered by Discuz! 2.5 |