@echo off
for /l %%i in (1,1,4) do set a=%%i&call :lp %%a%%
pause&goto :eof
:lp
for /l %%j in (1,1,4) do if not %%j equ %a% set b=%%j&call :loop %%a%% %%b%%
goto :eof
:loop
for /l %%k in (1,1,4) do (
if not %%k equ %a% set d=%%k
setlocal enabledelayedexpansion
if not !d! equ %b% set c=!d!
)
echo %a%%b%%c%
endlocal
goto :eof
@echo off
for /l %%i in (1,1,9) do (
setlocal enabledelayedexpansion
for /l %%j in (1,1,%%i) do (
set a=%%i&set b=%%j
set /a c=!a!*!b!&set /a m+=1
if !c! lss 10 set c= !c!
set "var=!a!*!b!=!c!"
set str=!str! !var!
if !m! equ !a! echo !str!&set m=0&set str=
)
endlocal
)
pause>nul
@echo off
:begin
cls
set /p var=输入要计算的日期(格式为2000-01-01):
if "%var:~4,1%%var:~7,1%"=="--" goto year
cls
echo 输入格式不正确!请返回正确输入。&ping /n 2 127.1>nul&goto begin
:year
set year=%var:~,4%
set /a str=%year%-%year%/4*4
:month
if %var:~5,1% equ 0 (set month=%var:~6,1%) else (set month=%var:~5,2%)
set /a month=%month%-1
if %month% equ 0 set /a number=0
if %month% equ 1 set /a number=31
if %month% equ 2 set /a number=31+28
if %month% equ 3 set /a number=31*2+28
if %month% equ 4 set /a number=31*2+30+28
if %month% equ 5 set /a number=31*3+30+28
if %month% equ 6 set /a number=31*3+30*2+28
if %month% equ 7 set /a number=31*4+30*2+28
if %month% equ 8 set /a number=31*5+30*2+28
if %month% equ 9 set /a number=31*5+30*3+28
if %month% equ 10 set /a number=31*6+30*3+28
if %month% equ 11 set /a number=31*6+30*4+28
if %str% equ 0 if %month% gtr 2 set /a number=%number%+1
:day
if %var:~8,1% equ 0 (set /a number=%number%+%var:~9,1%) else (set /a number=%
number%+%var:~8,2%)
cls
echo %var%是%year%年的第%number%天
pause>nul
@echo off
set/p p1=输入年:
set/p p2=输入月:
set/p p3=输入日:
set/a pn="!(p1%%4) & !(!(p1%%100)) | !(p1%%400)"
for /f "tokens=%p2%" %%i in ("0 31 59 90 120 151 181 212 243 273 304 334") do set/a n=%%i+p3
if %P2% gtr 2 set/a n+=pn
if %P2% equ 2 if %P3% equ 29 if %pn% equ 0 echo %p1%年不是闰年 所以%P2%月不会有%P3%日&pause&exit
echo %p1%年%p2%月%p3%日 是 %p1% 年的第 %n% 天
pause
@echo off&setlocal enabledelayedexpansion
set str=1 2 3 4
for %%a in (!str!) do (
set str1=!str:%%a=!
for %%b in (!str1!) do (
set str2=!str1:%%b=!
for %%c in (!str2!) do (
set str3=!str2:%%c=!
echo %%b%%c!str3: =!
set /a n+=1
)
)
)
echo 有%n%种排列
pause
@echo off&setlocal enabledelayedexpansion
for /l %%i in (99,-1,10) do (
set/a m=%%i*8,n=%%i*9
if !m! lss 100 if !n! gtr 100 set/a mn=809*%%i&set str=%%i
)
echo 809 × %str% = %mn%
pause
@echo off
set m=1
set n=10
:lp
set/a m+=1
set/a m=%m%*2,n-=1
if %n% gtr 1 goto lp
echo 第一天摘了 %m%
pause
@echo off
set/p var=请输入数字
set var=%var: =%
:lp
set .%var:~0,1% %random%=a
set var=%var:~1%
if not "%var%" == "" goto :lp
set/p =排序后为:<nul
for /f "delims=.= " %%i in ('set .') do set/p =%%i<nul
echo.
pause
@echo off
for /l %%i in (1,1,20) do set/a n+=%%i
echo %n%
pause
@echo off
set /p month=月份:
if %month% gtr 0 if %month% leq 2 echo 2只&pause&goto :eof
set /a month=%month%-2
set n=2&set m=2
:begin
set /a n=%n%+%m%
set /a w+=1
if %w% equ %month% echo %n%只&pause&goto :eof
set /a m=%m%+%n%
set /a v+=1
if %v% equ %month% echo %m%只&pause&goto :eof
goto begin
::判断素数【程序12】
@echo off
for /l %%a in (101,1,200) do call:j %%a
exit/b
:j
setlocal enabledelayedexpansion
set/a half=%1/2
for /l %%a in (2,1,!half!) do set/a r=%1%%%%a&if !r! equ 0 goto:eof
set/p=%1 <nul
::【程序25】 题目:求1+2!+3!+...+20!的和
@echo off&setlocal
for /l %%a in (1,1,20) do call:j %%a&set/a sum+=j
echo %sum%
pause
exit/b
:j
set/a j=1
for /l %%a in (1,1,%1) do set/a j*=%%a
::【程序19】找“完数”
@echo off
echo Calculating...
for /l %%a in (1,1,1000) do (
setlocal enabledelayedexpansion
set/a sum=0
set/a a'=%%a-1
for /l %%b in (1,1,!a'!) do (
set/a t=%%a%%%%b
if !t! equ 0 set/a sum+=%%b
)
if !sum! equ %%a set/p=%%a <nul
endlocal
)
pause
@echo off
for /l %%i in (100,1,999) do (
set str=%%i
setlocal enabledelayedexpansion
set a=!str:~,1!&set b=!str:~1,1!&set c=!str:~2,1!
set /a var=!a!*!a!*!a!+!b!*!b!*!b!+!c!*!c!*!c!
if !var! equ !str! echo !str!
endlocal
)
pause
@echo off
set /a n=100*10000000&set m=0
:begin
if %m% gtr 0 set str=%str%+2*%n%
if %m% gtr 0 set /a str=%str%/10000000
set /a n/=2&set /a m+=1
if %m% lss 10 goto begin
set /a str=%str%+100/2
echo 第10次球落地后共经过%str%米的距离
:lp
if "%n:~,-6%"=="" set n=0%n%
if "%n:~,-6%"=="" goto lp
echo 第10次弹起为0.%n%米
pause>nul
@echo off&setlocal enabledelayedexpansion
set n=10
for %%i in (2,2,2,2) do set /a n+=%%i&cls&echo 第五个人年纪是!n!岁
pause>nul
@echo off
echo.
echo 三位的水仙花数有:
echo.
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=%%i
set b=%%j
set 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
goto :eof
@echo off
set /a str=6*7*7*7*7*7*4
echo 能组成%str%个奇数
pause>nul
Originally posted by terse at 2008-4-11 22:34: 水仙花算法 确实三重循环为好 下面的忘记是那位版主写的 记得是namejm 版主写的: [code] @echo off echo. echo 三位的水仙花数有: echo. setlocal ...我不这样认为,我的代码就能很好地实现了(开始是少打了个*),何必还要写这么复杂的代码。
@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! ) pause19楼的:
@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[ Last edited by plp626 on 2008-4-12 at 12:51 AM ]
Originally posted by slore at 2008-4-12 14:45: 循环次数上一样麽? 哪个更少呢? 取每位,和将几位合起来那个更快呢?求 1-10000 的水仙花数,同时记录下批处理运行时间,不就有结果了?
Originally posted by 26933062 at 2008-4-12 03:00 PM: 求 1-10000 的水仙花数,同时记录下批处理运行时间,不就有结果了?两个时间一样,误差在0.01秒以内,小于%time%的“系统”误差。
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位数看来没有必要争什么。。。 如果你的自己够快的话,自己可以玩玩更多位数。。。
@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
@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! ) pause19楼的:
@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楼的循环体内语句又稍费点时间, 一短一长,能抵消吗? 我没试过,
Originally posted by 26933062 at 2008-4-13 03:01: set 到底哪个算法快,我确实不知道。 请问以下两个代码的效率有区别么?我以为代码一,应该快点吧? :[code] @echo off :: 代码一、 for /l %%a in (10000 ...代码1还用分离每一位保存起来呢? P我还是懒得做算术。。。你要是想追根问底就帮测试下好了。