中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-17 22:42
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,270 会员排行
DOS批处理 & 脚本技术(批处理室) » 出题目,全是我从C语言的题目中挑出来的
可打印版本  3,184 / 38
第31楼 plp626 发表于 2008-04-12 23:20
银牌会员 发帖 1,020 积分 2,278
其实我就没测试,从算法上分析我就知道不测试时间都一样,只是用的变量不一样,三重循环在理论上可能还稍费时间。
第32楼 slore 发表于 2008-04-13 02:12
铂金会员 发帖 2,478 积分 5,212
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位数看来没有必要争什么。。。
如果你的自己够快的话,自己可以玩玩更多位数。。。
第33楼 26933062 发表于 2008-04-13 03:01
银牌会员 发帖 879 积分 2,268
set 到底哪个算法快,我确实不知道。
请问以下两个代码的效率有区别么?我以为代码一,应该快点吧?
:
第34楼 plp626 发表于 2008-04-13 03:39
银牌会员 发帖 1,020 积分 2,278
大家很无聊,现在我觉得比大家更无聊:
把原来的再贴过来,认真看了,两个代码的循环次数分别为:
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算术运算(立方和)+一个判断输
第35楼 plp626 发表于 2008-04-13 04:05
银牌会员 发帖 1,020 积分 2,278
大家可真无聊,简直透顶了,
嗯 ,现在
我做出了一个决定,
准备比大家更无聊:

把原来的再贴过来,认真看,两个代码的循环次数分别为:
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楼的:
@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楼的:
@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楼的循环体内语句又稍费点时间,

一短一长,能抵消吗?

我没试过,
第36楼 plp626 发表于 2008-04-13 04:37
银牌会员 发帖 1,020 积分 2,278
34楼第一次点错了,也不知怎的,现在想删除都不行,影响浏览,真不爽
第37楼 bat-zw 发表于 2008-04-13 09:57
金牌会员 发帖 1,276 积分 3,105
  不管怎么说,大家研究问题的态度的确让我钦佩!同时我认为如果批处理的本身时间运行值在0.01秒内的时候(系统根本察觉不到误差值)真的没有什么必要去争论什么效率问题吧,还应该是从处理问题的方法上去多加研究和讨论,如研究代码构造和运算逻辑以及思路和出发点,我个人认为这才是我们最需要去深究的地方,不知大家以为所以然。
第38楼 slore 发表于 2008-04-13 10:55
铂金会员 发帖 2,478 积分 5,212
哎~老了。我错了。。。和写的另一个程序搞晕了。

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

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

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

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

PS:当你用C的时候你就知道了,取每位按字符操作麻烦,按数字操作也麻烦要取余……但是*10或*100很容易……
第39楼 slore 发表于 2008-04-13 10:57
铂金会员 发帖 2,478 积分 5,212
Originally posted by 26933062 at 2008-4-13 03:01:
set 到底哪个算法快,我确实不知道。
请问以下两个代码的效率有区别么?我以为代码一,应该快点吧?
:
上一页  1 2 3
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023