中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 出题目,全是我从C语言的题目中挑出来的
« [1] [2] [3] »
作者:
标题: 出题目,全是我从C语言的题目中挑出来的 上一主题 | 下一主题
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 31 楼』:  

其实我就没测试,从算法上分析我就知道不测试时间都一样,只是用的变量不一样,三重循环在理论上可能还稍费时间。



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-12 23:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 32 楼』:  



  Quote:
Originally posted by plp626 at 2008-4-12 23:20:
其实我就没测试,从算法上分析我就知道不测试时间都一样,只是用的变量不一样,三重循环在理论上可能还稍费时间。

你真的从算法分析了?时间复杂度都不一样!
还叫不测试时间都一样……


我敢保证测试时间绝对不一样!

只是用的变量不一样……?真的是这样麽?
3重循环,传统编程是1个x1(不变),1个x10,一个x100(那个例子好像是直接abc合并就可以了,这个是P里面set的支持。)加起来得到那个3位数。(算术运算比字符运算快。)
然后和每个的立方和比较。。。

这个是核心运算,看循环的次数确定时间复杂度一个是O(10^(n+1)-10^(n+1)/9)=O(10^n*8/9),一个是O(9^n)

数字越大第2中算法效率越高!

若判断3位数:
第一种:O(999-111+1)=O(889)
第二种:O(9*9*9)=O(729)
若判断10位数:
第一种:O(8888888889)
第二种:O(3486784401)

若判断20位:
第一种:O(88888888888888888889)
第二种:O(12157665459056928801)

20位的时候循环次数已经近8倍!

3位数看来没有必要争什么。。。
如果你的自己够快的话,自己可以玩玩更多位数。。。

2008-4-13 02:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 33 楼』:  

set 到底哪个算法快,我确实不知道。
请问以下两个代码的效率有区别么?我以为代码一,应该快点吧?
:
@echo off
:: 代码一、
for /l %%a in (10000 1 99999) do echo %%a
::代码二、
for /l %%a in (1 1 9) do (
  for /l %%b in (0 1 9) do (
    for /l %%c in (0 1 9) do (
      for /l %%d in (0 1 9) do (
        for /l %%e in (0 1 9) do (
           echo %%a%%b%%c%%d%%d
)))))
pause




致精致简!
2008-4-13 03:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 34 楼』:  

大家很无聊,现在我觉得比大家更无聊:
把原来的再贴过来,认真看了,两个代码的循环次数分别为:
15楼的:999-100+1=900次
19楼的:9*9*10=     900次
再分析循环体所用语句:

15楼的:一次set 直接赋值+3次set/a赋值+3次变量截取             +1次set/a算术运算(立方和)+一个判断输出
19楼的:一次set 直接赋值+3次set/a赋值+1次set直接赋值(合并)+1次set/a算术运算(立方和)+一个判断输

2008-4-13 03:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 35 楼』:  

大家可真无聊,简直透顶了,
嗯  ,现在
我做出了一个决定,
准备比大家更无聊:

把原来的再贴过来,认真看,两个代码的循环次数分别为:
15楼的:999-100+1=900次(1重循环)
19楼的:9*10*10=     900次(3重循环)
再分析循环体所用语句:

15楼的:一次set 直接赋值(set str=%%i)+3次set/a赋值+3次变量截取+1次set/a算术运算(立方和)+一个判断输出(if !var! equ !str! echo !str!)
19楼的:一次set 直接赋值(set num1=!a!!b!!c!)+3次set/a赋值+(合并)+1次set/a算术运算(立方和)+一个判断输出(if !num1! equ !num2! echo !num1!)
15楼的:

  Quote:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (100,1,999) do (
    set str=%%i
    set/a a=!str:~,1!, b=!str:~1,1!, c=!str:~2,1!
    set /a var=!a!*!a!*!a!+!b!*!b!*!b!+!c!*!c!*!c!
    if !var! equ !str! echo !str!
)
pause

19楼的:

  Quote:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,9) do for /l %%j in (0,1,9) do for /l %%k in (0,1,9) do (
       set/a a=%%i,b=%%j,c=%%k
       set num1=!a!!b!!c!
       set /a num2=!a!*!a!*!a!+!b!*!b!*!b!+!c!*!c!*!c!
       if !num1! equ !num2! echo !num1!
)
pause

以下是我的分析,(我不是计算机出身的,批处理只是业余爱好,说错话内行勿笑)

同样的循环次数,不同循环重数,花费的时间不同的,重数多了,指令就多了,花的时间就长了,这么看来就是15楼的循环花的时间短些。

问题在变量的截取上,截取是花时间的 而那句!a!!b!!c!所谓的”合并“只是3个变量放到一起了,而
a=!str:~,1!, b=!str:~1,1!, c=!str:~2,1!
这句对应地有某些指令告诉解释器,到底是str的那些部分被截取赋给变量a,b,c这是花些时间的.
这么看来,15楼的循环体内语句又稍费点时间,

一短一长,能抵消吗?

我没试过,



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-13 04:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 36 楼』:  

34楼第一次点错了,也不知怎的,现在想删除都不行,影响浏览,真不爽



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-13 04:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 37 楼』:  

  不管怎么说,大家研究问题的态度的确让我钦佩!同时我认为如果批处理的本身时间运行值在0.01秒内的时候(系统根本察觉不到误差值)真的没有什么必要去争论什么效率问题吧,还应该是从处理问题的方法上去多加研究和讨论,如研究代码构造和运算逻辑以及思路和出发点,我个人认为这才是我们最需要去深究的地方,不知大家以为所以然。



批处理之家新域名:www.bathome.net
2008-4-13 09:57
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 38 楼』:  

哎~老了。我错了。。。和写的另一个程序搞晕了。

那个程序没有0。。。所以每层循环是1-9
算成9次了……

水仙花这个第1位是9其他是10...
但是对字符的处理是肯定比数字慢,合并是快点。

还确定了下:
水仙花数只是说3位数。。。所以不会存在太大的数字。。。所以速度差可以忽略。

所以不好意思说了哪么多,误导了。

PS:当你用C的时候你就知道了,取每位按字符操作麻烦,按数字操作也麻烦要取余……但是*10或*100很容易……

2008-4-13 10:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 39 楼』:  



  Quote:
Originally posted by 26933062 at 2008-4-13 03:01:
set 到底哪个算法快,我确实不知道。
请问以下两个代码的效率有区别么?我以为代码一,应该快点吧?
:[code]
@echo off
:: 代码一、
for /l %%a in (10000 ...

代码1还用分离每一位保存起来呢?
P我还是懒得做算术。。。你要是想追根问底就帮测试下好了。

2008-4-13 10:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: