中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]从随机数字串中找出有多少对一样的数子。
« [1] [2] »
作者:
标题: [已结]从随机数字串中找出有多少对一样的数子。 上一主题 | 下一主题
clian76
中级用户





积分 363
发帖 162
注册 2007-4-22
状态 离线
『楼 主』:  [已结]从随机数字串中找出有多少对一样的数子。

给出一串随机数字,要求找出里面有几对一样的数字。比如:
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 ]

2009-1-8 00:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 2 楼』:  

如果有三个或以上怎么办?
如:
1110
11110



正在潜水修练的批处理小白
2009-1-8 01:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 3 楼』:  

@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对

   此帖被 +11 点积分     点击查看详情   
评分人:【 HAT 分数: +2  时间:2009-1-8 13:30
评分人:【 moniuming 分数: +5  时间:2009-1-8 14:26
评分人:【 clian76 分数: +4  时间:2009-1-8 17:46




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-8 02:35
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
clian76
中级用户





积分 363
发帖 162
注册 2007-4-22
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by dikex at 2009-1-8 01:14 AM:
如果有三个或以上怎么办?
如:
1110
11110

1110 1对
11110 2对
不知道批处理能不能做到这样,如果没办法就让它把全部可能的对子对比出来也行。谢谢!

2009-1-8 13:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
clian76
中级用户





积分 363
发帖 162
注册 2007-4-22
状态 离线
『第 5 楼』:  



  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老师的解答!几句高深的代码已完美做到,非常感谢!!

2009-1-8 13:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 6 楼』:  

三人行必有我师焉!
共学共勉吧



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-8 14:37
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『第 7 楼』:  


@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


   此帖被 +6 点积分     点击查看详情   
评分人:【 HAT 分数: +2  时间:2009-1-8 17:36
评分人:【 clian76 分数: +4  时间:2009-1-8 17:45


2009-1-8 14:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
clian76
中级用户





积分 363
发帖 162
注册 2007-4-22
状态 离线
『第 8 楼』:  



  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大侠!!学习了!

2009-1-8 16:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
clian76
中级用户





积分 363
发帖 162
注册 2007-4-22
状态 离线
『第 9 楼』:  



  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方式,或其它方法,可行吗?

2009-1-8 17:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by clian76 at 2009-1-8 17:22:

不知道这里能不能去掉标签:loop,把它变成FOR方式,或其它方法,可行吗?

这里感觉还是用if goto简单点,用for不好实现吧。

2009-1-8 18:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
clian76
中级用户





积分 363
发帖 162
注册 2007-4-22
状态 离线
『第 11 楼』:  



  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 (
再让程序把这三组随机数字串的对子数和对子数值显示出来。

我试了几个小时一直没有成功,希望高手再次出招,也好学习。谢谢!

2009-1-8 18:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『第 12 楼』:  



  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


2009-1-8 21:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
clian76
中级用户





积分 363
发帖 162
注册 2007-4-22
状态 离线
『第 13 楼』:  



  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之外的地方。

2009-1-8 23:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 14 楼』:  改进一下

@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 ]

   此帖被 +4 点积分        点击查看详情   
评分人:【 clian76 分数: +4  时间:2009-1-10 02:46




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-9 00:10
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 15 楼』:  



  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 ]

   此帖被 +4 点积分        点击查看详情   
评分人:【 clian76 分数: +4  时间:2009-1-10 02:47




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-9 00:47
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: