标题: [数值计算] 批处理打印趣味数列 [打印本页]
作者: ArdentMan 时间: 2011-8-14 11:05 标题: 批处理打印趣味数列
用批打印出如下趣味数列(9行9列),示例中的“-”“|”是为了说明数字间的排列关系而并非数列本身所有(打印时可省略):- 01 02 05 10 17...
- | | | |
- 04-03 06 11 18...
- | | |
- 09-08-07 12 19...
- | |
- 16-15-14-13 20...
- |
- 25-24-23-22-21...
- .................
复制代码
作者: hanyeguxing 时间: 2011-8-14 12:44
本帖最后由 hanyeguxing 于 2011-8-14 12:50 编辑
- @echo off&setlocal enabledelayedexpansion&set/a 行=9,列=9,b=列-1
- for /l %%a in (1,1,%行%) do (
- set/a n+=1,m=%%a*%%a,k=100+m&set/p =!k:~-2! <nul
- for /l %%b in (1,1,%b%) do set/a "c=^!(%%b/n)","m+=^!c*(2*%%b-1)-1*c",k=100+m&set/p =!k:~-2! <nul
- echo;)
- pause>nul
复制代码
作者: ArdentMan 时间: 2011-8-14 12:45
本帖最后由 ArdentMan 于 2011-8-14 12:53 编辑
本人拙解:- @Echo Off&SetLocal EnableDelayedExpansion
- For /L %%i In (1,1,9) Do (
- set ".%%i="
- Set /A Pf=%%i*%%i,Num=Pf-2*%%i+2,Number=Pf-%%i+1,Count=%%i
- For /L %%j In (!Pf!,-1,!Num!) Do (
- Set "Str=00%%j"&Set "Str=!Str:~-2!"
- If %%j GEQ !Number! (
- Set ".%%i=!.%%i! !Str!" (
- ) Else (
- Set /A Count-=1
- For %%k In (!Count!) Do Set ".%%k=!.%%k! !Str!"
- )
- )
- )
- Set .
- Pause>Nul
复制代码
作者: CrLf 时间: 2011-8-14 12:50
- @echo off&setlocal enabledelayedexpansion
- set /a w=h=9
- for /l %%a in (1 1 %h%) do (
- for /l %%b in (1 1 %w%) do (
- set /a "st*=^!^!~-%%b","n=^!(~-%%b/%%a)*(%%a*%%a-~-%%b+100)+^!^!(~-%%b/%%a)*(%%a+%%b+st+99)","st+=%%b*2-2"
- set "str=!str!!n:~-2! "
- )
- echo !str!&set str=
- )
- pause
复制代码
作者: Hello123World 时间: 2011-8-14 16:56
规律看懂了,算法看都没看,想想头就大了,这题目搜藏了。
By the way,2楼的代码运行没反应。3-4楼正常输出。
作者: ArdentMan 时间: 2011-8-14 21:16
本帖最后由 ArdentMan 于 2011-8-14 21:26 编辑
三楼算法一次性输出方案:- @Echo Off&SetLocal EnableDelayedExpansion
- For /L %%i In (1,1,9) Do (
- For /L %%j In (1,1,9) Do (
- If %%j EQU 1 (
- Set /A Num=%%i*%%i+100
- ) Else (
- If %%j LEQ %%i (
- Set /A Num=%%i*%%i-%%j+101
- ) Else (
- Set /A Num=%%j*%%j-2*%%j+%%i+101
- )
- )
- Set "Str=!Str! !Num:~-2!"
- )
- Echo !Str:~1!&Set "Str="
- )
- Pause>Nul
复制代码
作者: plp626 时间: 2011-8-15 23:53
把它看做矩阵,即a(1,1)=1; a(1,2)=2; a(1,3)=5
研究出了一个公式:
设p=max(m,n)则 a(m,n)=p*p-p-n+m+1
作者: terse 时间: 2011-8-16 00:56
本帖最后由 terse 于 2011-8-17 08:45 编辑
模拟走法 缺点是多了个IF- @echo off&setlocal enabledelayedexpansion
- set L=9
- for /l %%i in (1 1 %L%) do (
- for /l %%j in (1 1 %L%) do (
- if %%j leq %%i (set /a N=%%i*%%i-~-%%j+1000)else set /a "N=~-%%j*~-%%j+%%i+1000"
- set _Tem=!_Tem! !N:~-2!
- )
- echo !_Tem!&set _Tem=
- )
- pause
复制代码
发现 将IF 这句 可替换为- ^!(~-%%j/%%i)*(%%i*%%i-~-%%j)+^!^!(~-%%j/%%i)*(~-%%j*~-%%j+%%i)
复制代码
作者: ArdentMan 时间: 2011-8-16 08:39
plp626连公式都搞出来了,真牛人一个
作者: 523066680 时间: 2011-8-16 09:32
我现在超烂的~ 重在参与啦- @echo off &setlocal enabledelayedexpansion
- set /a n=0
- for /l %%a in (1,1,9) do (
- set /a tempx=%%a-1
- call :next 1 %%a !tempx! 1
- )
- for /l %%a in (1,1,9) do (
- for /l %%b in (1,1,9) do (
- set /p= !send[%%a][%%b]:~-2!<nul
- )
- echo,
- )
- pause
-
- :next
- for /l %%a in (1,1,%2) do (
- set /a n+=1
- set send[%%a][%2]=0!n!
- )
- for /l %%a in (%3,-1,1) do (
- set /a n+=1
- set send[%2][%%a]=0!n!
- )
复制代码
作者: plp626 时间: 2011-8-16 13:02
本帖最后由 plp626 于 2011-8-16 20:10 编辑
- @echo off&rem 算法见7楼,O(1)型算法
- for /l %%m in (1 1 9)do echo/&for /l %%n in (1 1 9)do (
- set/a "m=%%m,n=%%n,p=(m-n>>31)*(m-n)+m,t=100+p*p-p-n+m+1"
- call set/p=%%t:~-2%% <nul
- )
- pause>nul
复制代码
关于max(m,n)的set语句实现(m和n是整数):
我们知道 max(m,n)=(m+n)/2+|m-n|/2
绝对值函数abs(x)=x*sgn(x)
而(x>>31)*2+1的效果就是sgn(x)
[稍稍的差别是set语句的sgn(0)不为0,但abs(0)仍为0,这就够了]
合成就得到max(m,n)的set语句:
set/a "max=(m+n+(m-n>>31)*2*(m-n)+m-n)/2"
化简得:- set/a "max=m+(m-n>>31)*(m-n)"
复制代码
同理可得min(m,n)的set语句:- set/a "min=n-(m-n>>31)*(m-n)"
复制代码
================================
zm兄的关于max(m,n)的set 语句思路(今天发现自己走了弯路,哈):- set/a max=n+!!(m/n)*(m-n)
复制代码
同理得:- set/a min=m-!!(m/n)*(m-n)
复制代码
在不开启变量延迟时,这个语句相对来说更简短,相比移位操作少2个字符:- @echo off
- for /l %%m in (1 1 9)do echo/&for /l %%n in (1 1 9)do (
- set/a "m=%%m,n=%%n,p=!!(m/n)*(m-n)+n,t=100+p*p-p-n+m+1"
- call set/p=%%t:~-2%% <nul
- )
- pause>nul
复制代码
作者: batman 时间: 2011-8-18 08:36
希望各位高人在写代码时给新人们一个看懂代码的机会。。。
作者: broly 时间: 2011-8-18 10:53
我觉得去看懂代码也是一个学习的过程,开始不懂,然后试图搞懂,就会自己动手找资料,慢慢的接触的东西就多了(个人观点)
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |