中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 06:08
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 出题目,全是我从C语言的题目中挑出来的
31 发表于 2008-04-12 23:20 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
其实我就没测试,从算法上分析我就知道不测试时间都一样,只是用的变量不一样,三重循环在理论上可能还稍费时间。
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
32 发表于 2008-04-13 02:12 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
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 发表于 2008-04-13 03:01 ·  中国 湖南 长沙 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
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
致精致简!
34 发表于 2008-04-13 03:39 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
大家很无聊,现在我觉得比大家更无聊:
把原来的再贴过来,认真看了,两个代码的循环次数分别为:
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 发表于 2008-04-13 04:05 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
大家可真无聊,简直透顶了,
嗯 ,现在
我做出了一个决定,
准备比大家更无聊:

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

一短一长,能抵消吗?

我没试过,
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
36 发表于 2008-04-13 04:37 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
34楼第一次点错了,也不知怎的,现在想删除都不行,影响浏览,真不爽
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
37 发表于 2008-04-13 09:57 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线
  不管怎么说,大家研究问题的态度的确让我钦佩!同时我认为如果批处理的本身时间运行值在0.01秒内的时候(系统根本察觉不到误差值)真的没有什么必要去争论什么效率问题吧,还应该是从处理问题的方法上去多加研究和讨论,如研究代码构造和运算逻辑以及思路和出发点,我个人认为这才是我们最需要去深究的地方,不知大家以为所以然。
批处理之家新域名:www.bathome.net
38 发表于 2008-04-13 10:55 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
哎~老了。我错了。。。和写的另一个程序搞晕了。

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

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

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

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

PS:当你用C的时候你就知道了,取每位按字符操作麻烦,按数字操作也麻烦要取余……但是*10或*100很容易……
39 发表于 2008-04-13 10:57 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
Originally posted by 26933062 at 2008-4-13 03:01:
set 到底哪个算法快,我确实不知道。
请问以下两个代码的效率有区别么?我以为代码一,应该快点吧?
:

@echo off
:: 代码一、
for /l %%a in (10000 ...


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