[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 批处理打印趣味数列

用批打印出如下趣味数列(9行9列),示例中的“-”“|”是为了说明数字间的排列关系而并非数列本身所有(打印时可省略):
  1. 01 02 05 10 17...
  2.    |  |  |  |
  3. 04-03 06 11 18...
  4.       |  |  |
  5. 09-08-07 12 19...
  6.          |  |
  7. 16-15-14-13 20...
  8.             |
  9. 25-24-23-22-21...
  10. .................
复制代码
一路飘过的鸟~~~

本帖最后由 hanyeguxing 于 2011-8-14 12:50 编辑
  1. @echo off&setlocal enabledelayedexpansion&set/a 行=9,列=9,b=列-1
  2. for /l %%a in (1,1,%行%) do (
  3.     set/a n+=1,m=%%a*%%a,k=100+m&set/p =!k:~-2! <nul
  4.     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
  5.     echo;)
  6. pause>nul
复制代码
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

本帖最后由 ArdentMan 于 2011-8-14 12:53 编辑

本人拙解:
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. For /L %%i In (1,1,9) Do (
  3.   set ".%%i="
  4.   Set /A Pf=%%i*%%i,Num=Pf-2*%%i+2,Number=Pf-%%i+1,Count=%%i
  5.   For /L %%j In (!Pf!,-1,!Num!) Do (
  6.     Set "Str=00%%j"&Set "Str=!Str:~-2!"
  7.     If %%j GEQ !Number! (
  8.       Set ".%%i=!.%%i! !Str!" (
  9.       ) Else (
  10.       Set /A Count-=1
  11.       For %%k In (!Count!) Do Set ".%%k=!.%%k! !Str!"
  12.     )
  13.   )
  14. )
  15. Set .
  16. Pause>Nul
复制代码
1

评分人数

一路飘过的鸟~~~

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set /a w=h=9
  3. for /l %%a in (1 1 %h%) do (
  4. for /l %%b in (1 1 %w%) do (
  5. set /a "st*=^!^!~-%%b","n=^!(~-%%b/%%a)*(%%a*%%a-~-%%b+100)+^!^!(~-%%b/%%a)*(%%a+%%b+st+99)","st+=%%b*2-2"
  6. set "str=!str!!n:~-2! "
  7. )
  8. echo !str!&set str=
  9. )
  10. pause
复制代码
1

评分人数

TOP

规律看懂了,算法看都没看,想想头就大了,这题目搜藏了。

By the way,2楼的代码运行没反应。3-4楼正常输出。

TOP

本帖最后由 ArdentMan 于 2011-8-14 21:26 编辑

三楼算法一次性输出方案:
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. For /L %%i In (1,1,9) Do (
  3.   For /L %%j In (1,1,9) Do (
  4.     If %%j EQU 1 (
  5.       Set /A Num=%%i*%%i+100
  6.       ) Else (
  7.       If %%j LEQ %%i (
  8.         Set /A Num=%%i*%%i-%%j+101
  9.         ) Else (
  10.         Set /A Num=%%j*%%j-2*%%j+%%i+101
  11.       )
  12.     )
  13.     Set "Str=!Str! !Num:~-2!"
  14.   )
  15.   Echo !Str:~1!&Set "Str="
  16. )
  17. Pause>Nul   
复制代码
一路飘过的鸟~~~

TOP

把它看做矩阵,即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
1

评分人数

    • else: 好深入技术 + 1

TOP

本帖最后由 terse 于 2011-8-17 08:45 编辑

模拟走法  缺点是多了个IF
  1. @echo off&setlocal enabledelayedexpansion
  2. set L=9
  3. for /l %%i in (1 1 %L%) do (
  4.     for /l %%j in (1 1 %L%) do (
  5.         if %%j leq %%i (set /a N=%%i*%%i-~-%%j+1000)else set /a "N=~-%%j*~-%%j+%%i+1000"
  6.         set _Tem=!_Tem! !N:~-2!
  7.     )
  8.     echo !_Tem!&set _Tem=
  9. )
  10. pause
复制代码
发现 将IF 这句 可替换为
  1. ^!(~-%%j/%%i)*(%%i*%%i-~-%%j)+^!^!(~-%%j/%%i)*(~-%%j*~-%%j+%%i)
复制代码
1

评分人数

    • else: 又见步进技术 + 1

TOP

plp626连公式都搞出来了,真牛人一个
一路飘过的鸟~~~

TOP

我现在超烂的~ 重在参与啦
  1. @echo off &setlocal enabledelayedexpansion
  2. set /a n=0
  3. for /l %%a in (1,1,9) do (
  4. set /a tempx=%%a-1
  5. call :next 1 %%a !tempx! 1
  6. )
  7. for /l %%a in (1,1,9) do (
  8. for /l %%b in (1,1,9) do (
  9. set /p= !send[%%a][%%b]:~-2!<nul
  10. )
  11. echo,
  12. )
  13. pause
  14. :next
  15. for /l %%a in (1,1,%2) do (
  16. set /a n+=1
  17. set send[%%a][%2]=0!n!
  18. )
  19. for /l %%a in (%3,-1,1) do (
  20. set /a n+=1
  21. set send[%2][%%a]=0!n!
  22. )
复制代码
1

评分人数

    • else: 版主v5技术 + 1

TOP

本帖最后由 plp626 于 2011-8-16 20:10 编辑
  1. @echo off&rem 算法见7楼,O(1)型算法
  2. for /l %%m in (1 1 9)do echo/&for /l %%n in (1 1 9)do (
  3.     set/a "m=%%m,n=%%n,p=(m-n>>31)*(m-n)+m,t=100+p*p-p-n+m+1"
  4.     call set/p=%%t:~-2%% <nul
  5. )
  6. 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"
化简得:
  1. set/a "max=m+(m-n>>31)*(m-n)"
复制代码
同理可得min(m,n)的set语句:
  1. set/a "min=n-(m-n>>31)*(m-n)"
复制代码
================================
zm兄的关于max(m,n)的set 语句思路(今天发现自己走了弯路,哈):
  1. set/a max=n+!!(m/n)*(m-n)
复制代码
同理得:
  1. set/a min=m-!!(m/n)*(m-n)
复制代码
在不开启变量延迟时,这个语句相对来说更简短,相比移位操作少2个字符:
  1. @echo off
  2. for /l %%m in (1 1 9)do echo/&for /l %%n in (1 1 9)do (
  3.     set/a "m=%%m,n=%%n,p=!!(m/n)*(m-n)+n,t=100+p*p-p-n+m+1"
  4.     call set/p=%%t:~-2%% <nul
  5. )
  6. pause>nul
复制代码
1

评分人数

    • ArdentMan: 牛人,就是代码难看点技术 + 1

TOP

希望各位高人在写代码时给新人们一个看懂代码的机会。。。
***共同提高***

TOP

我觉得去看懂代码也是一个学习的过程,开始不懂,然后试图搞懂,就会自己动手找资料,慢慢的接触的东西就多了(个人观点)
---学无止境---

TOP

返回列表