标题: [已结]从随机数字串中找出有多少对一样的数子。
[打印本页]
作者: clian76
时间: 2009-1-8 00:20
标题: [已结]从随机数字串中找出有多少对一样的数子。
给出一串随机数字,要求找出里面有几对一样的数字。比如:
14204 有1对(两个4)
08448 有2对(4和8)
93997 有1对
10257 有0对
998 有1对
208 有0对
4293 有0对
。。。。。。
最好是不产生临时文件。谢谢!!!
问题已完美解决,非常感谢各位高手!!!
[
Last edited by clian76 on 2009-1-10 at 02:44 ]
作者: dikex
时间: 2009-1-8 01:14
如果有三个或以上怎么办?
如:
1110
11110
作者: netbenton
时间: 2009-1-8 02:35
@echo off
for /f "skip=15" %%i in (%~n0%~x0) do (
setlocal enabledelayedexpansion
set ru=0
set v=%%i
for /l %%i in (1,1,20) do (if defined v (call set "a=!v:~0,1!"&call set "v=!v:~1!"&set /a num!a!+=1))
for /l %%i in (0,1,9) do (set /a ru=num%%i/2+ru)
echo %%i 有 [!ru!] 对数
endlocal
)
pause
goto :eof
给出一串随机数字,要求找出里面有几对一样的数字。比如:
14204 有1对(两个4)
08448 有2对(4和8)
93997 有1对
10257 有0对
998 有1对
208 有0对
4293 有0对
作者: clian76
时间: 2009-1-8 13:01
Quote: |
Originally posted by dikex at 2009-1-8 01:14 AM:
如果有三个或以上怎么办?
如:
1110
11110 |
|
1110 1对
11110 2对
不知道批处理能不能做到这样,如果没办法就让它把全部可能的对子对比出来也行。谢谢!
作者: clian76
时间: 2009-1-8 13:08
Quote: |
Originally posted by netbenton at 2009-1-8 02:35 AM:
@echo off
for /f "skip=15" %%i in (%~n0%~x0) do (
setlocal enabledelayedexpansion
set ru=0
set v=%%i
for /l %%i in (1,1,20) do (if defined v (call set "a=!v:~0,1!"&call ... |
|
谢谢netbenton老师的解答!几句高深的代码已完美做到,非常感谢!!
作者: netbenton
时间: 2009-1-8 14:37
三人行必有我师焉!
共学共勉吧
作者: linee
时间: 2009-1-8 14:39
@echo off&setlocal enabledelayedexpansion
set _str=%random%&set str=!_str!
set j=
:loop
if "%str%" neq "" (
set i=%str:~0,1%
if not defined str!i! (set str!i!=1) else set/a str!i!+=1,j=0
set str=%str:~1%
goto loop
)
if defined j (
for /f "tokens=1,2delims==" %%i in ('set str')do if %%j gtr 1 set str=%%i&set "strout=!strout!!str:~3,1!和"&set/a j+=%%j/2
echo %_str% 有!j!对(!strout:~0,-1!)
) else echo %_str% 有0对
pause>nul
作者: clian76
时间: 2009-1-8 16:56
Quote: |
Originally posted by linee at 2009-1-8 02:39 PM:
[code]@echo off&setlocal enabledelayedexpansion
set _str=%random%&set str=!_str!
set j=
:loop
if "%str%" neq "" (
set i=%str:~0,1%
if not defined str!i! (set str ... |
|
linee大侠的代码更详尽,对子的数值也显示出来了,收下,谢谢linee大侠!!学习了!
作者: clian76
时间: 2009-1-8 17:22
Quote: |
Originally posted by linee at 2009-1-8 02:39 PM:
[code]@echo off&setlocal enabledelayedexpansion
set _str=%random%&set str=!_str!
set j=
:loop
if "%str%" neq "" (
set i=%str:~0,1%
if not defined str!i! (set str ... |
|
不知道这里能不能去掉标签:loop,把它变成FOR方式,或其它方法,可行吗?
作者: linee
时间: 2009-1-8 18:33
Quote: |
Originally posted by clian76 at 2009-1-8 17:22:
不知道这里能不能去掉标签:loop,把它变成FOR方式,或其它方法,可行吗? |
|
这里感觉还是用if goto简单点,用for不好实现吧。
作者: clian76
时间: 2009-1-8 18:43
Quote: |
Originally posted by linee at 2009-1-8 06:33 PM:
这里感觉还是用if goto简单点,用for不好实现吧。 |
|
这里我想打出多组随机数字串,想把开始转换成用:
FOR /F %%I IN ('echo %random%^&echo.%random%^&echo.%random%') do (
再让程序把这三组随机数字串的对子数和对子数值显示出来。
我试了几个小时一直没有成功,希望高手再次出招,也好学习。谢谢!
作者: linee
时间: 2009-1-8 21:06
Quote: |
Originally posted by clian76 at 2009-1-8 18:43:
这里我想打出多组随机数字串,想把开始转换成用:
FOR /F %%I IN ('echo %random%^&echo.%random%^&echo.%random%') do (
再让程序把这三组随机数字串的对子数 ... |
|
这样试试,
@echo off
FOR /F %%a IN ('echo %random%^&echo %random%^&echo %random%') do (
setlocal enabledelayedexpansion
set _str=%%a&set str=!_str!
set j=
for /l %%x in (1,1,5) do (
if "!str!" neq "" (
set i=!str:~0,1!
if not defined str!i! (set str!i!=1) else set/a str!i!+=1,j=0
set str=!str:~1!
) )
if defined j (
for /f "tokens=1,2delims==" %%i in ('set str')do if %%j gtr 1 set str=%%i&set "strout=!strout!!str:~3,1!和"&set/a j+=%%j/2
echo !_str! 有!j!对(!strout:~0,-1!)
) else echo !_str! 有0对
endlocal
)
pause&goto:EOF
作者: clian76
时间: 2009-1-8 23:17
Quote: |
Originally posted by linee at 2009-1-8 09:06 PM:
这样试试,
[code]@echo off
FOR /F %%a IN ('echo %random%^&echo %random%^&echo %random%') do (
setlocal enabledelayedexpansion
set _str=%%a&set str=!_str!
set j=
... |
|
有什么办法把变量:
!_str!
!j!
!strout:~0,-1!
拿到endlocal之后,就是这里的PAUSE之后让程序正常显示变量。我试了把endlocal拿到代码最后,这样程序就出错了!我的目的是这里的变量在别的标签里也能用,就是这个FOR之外的地方。
作者: netbenton
时间: 2009-1-9 00:10
标题: 改进一下
@echo off
for /f "skip=16" %%i in (%~n0%~x0) do (
setlocal enabledelayedexpansion
set ru=0
set v=%%i
set /p=%%i <nul
for /l %%i in (1,1,20) do (if defined v (call set "a=!v:~0,1!"&call set "v=!v:~1!"&set /a num!a!+=1))
for /l %%i in (0,1,9) do (set /a var=num%%i/2&set /a ru=var+ru&if !num%%i! gtr 1 set /p=!var!对%%i <nul)
echo 共有 !ru! 对
endlocal
)
pause
goto :eof
增加了var变量用于分别显示各数出现频率
给出一串随机数字,要求找出里面有几对一样的数字。比如:
14204 1对4 共有 1 对
08448 1对4 1对8 共有 2 对
939979 2对9 共有 2 对
10257 共有 0 对
998 1对9 共有 1 对
208 共有 0 对
4293 共有 0 对
[
Last edited by netbenton on 2009-1-9 at 14:38 ]
作者: netbenton
时间: 2009-1-9 00:47
Quote: |
Originally posted by clian76 at 2009-1-8 23:17:
有什么办法把变量:
!_str!
!j!
!strout:~0,-1!
拿到endlocal之后,就是这里的PAUSE之后让程序正常显示变量。我试了把endlocal拿到代码最后,这样程序就 ... |
|
***把 setlocal enabledelayedexpansion 也拿到外面就可以了
只是在for里面要注意变量的必要的初始化***
***附: 这样也可以产生随机, 我也是刚发现!***
@echo off
setlocal enabledelayedexpansion
for /f "skip=20" %%i in (%~n0%~x0) do (
set ru=0&set a=
for /l %%i in (0,1,9) do set num%%i=0
call set number=%%%i
set v=!number!
set nu=(
for /l %%i in (1,1,20) do (if defined v (call set "a=!v:~0,1!"&call set "v=!v:~1!"&set /a num!a!+=1))
for /l %%i in (0,1,9) do (set /a ru=num%%i/2+ru&if !num%%i! gtr 1 set nu=!nu!和%%i)
set nu=!nu!)&set nu=!nu:(和=(!&set nu=!nu:()=!
echo !number! 有 !ru! 对 !nu!
)
pause
endlocal
goto :eof
%random%
%random%
%random%%random%
%random%%random%
%random%%random%%random%
%random%%random%%random%
%random%%random%%random%%random%
%random%%random%%random%%random%
[
Last edited by netbenton on 2009-1-9 at 14:24 ]
作者: terse
时间: 2009-1-9 03:16
凑个热闹
@echo off
for %%a in (%random% %random% %random%) do (
set str=%%a
setlocal enabledelayedexpansion
for /l %%i in (0 1 4) do if not "!str:~%%i,1!"=="" set/a _!str:~%%i,1!+=1
for /f "tokens=1,2 delims=_=" %%i in ('set _') do (
if %%j gtr 1 set/a n+=1&if defined var (set var=!var!和%%i)else set var=%%i
)
if defined n (echo %%a 有 !n! 对(!var!))else echo %%a 有 0 对
endlocal
)
pause
作者: linee
时间: 2009-1-9 11:37
Quote: |
Originally posted by clian76 at 2009-1-8 23:17:
有什么办法把变量:
!_str!
!j!
!strout:~0,-1!
拿到endlocal之后,就是这里的PAUSE之后让程序正常显示变量。我试了把endlocal拿到代码最后,这样程序就 ... |
|
这样呢?
@echo off
FOR /F %%a IN ('echo %random%^&echo %random%^&echo %random%') do (
set j1=&set s1=
call :rndd %%a j1 s1
if defined j1 (call echo %%a 有%%j1%%对(%%s1%%)) else echo %%a 有0对
)
pause&goto:EOF
:rndd
setlocal enabledelayedexpansion
set str=%1
set j=
for /l %%x in (1,1,5) do (
if "!str!" neq "" (
set i=!str:~0,1!
if not defined str!i! (set str!i!=1) else set/a str!i!+=1,j=0
set str=!str:~1!
) )
if defined j (
for /f "tokens=1,2delims==" %%i in ('set str')do if %%j gtr 1 set str=%%i&set "strout=!strout!!str:~3,1!和"&set/a j+=%%j/2
)
endlocal&if "%strout%" neq "" set %2=%j%&set %3=%strout:~0,-1%
[
Last edited by linee on 2009-1-9 at 15:57 ]
作者: linee
时间: 2009-1-9 12:06
16楼更精简,不过对子数要处理下,比如:1111 仍显示 有1对(1)正确应该显示 有2对 (1)
作者: terse
时间: 2009-1-9 19:54
Quote: |
Originally posted by linee at 2009-1-9 12:06:
16楼更精简,不过对子数要处理下,比如:1111 仍显示 有1对(1)正确应该显示 有2对 (1) |
|
1111如要显示2对 那就set/a n+=%%j/2