找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 33223|回复: 12

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

[复制链接]
发表于 2011-8-14 11:05:23 | 显示全部楼层 |阅读模式
用批打印出如下趣味数列(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. .................
复制代码
发表于 2011-8-14 12:44:45 | 显示全部楼层
本帖最后由 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
复制代码
 楼主| 发表于 2011-8-14 12:45:24 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
Hello123World + 1 热心人,我顶你。

查看全部评分

发表于 2011-8-14 12:50:49 | 显示全部楼层
  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技术 +1 收起 理由
Hello123World + 1 乐于助人

查看全部评分

发表于 2011-8-14 16:56:43 | 显示全部楼层
规律看懂了,算法看都没看,想想头就大了,这题目搜藏了。

By the way,2楼的代码运行没反应。3-4楼正常输出。
 楼主| 发表于 2011-8-14 21:16:51 | 显示全部楼层
本帖最后由 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   
复制代码
发表于 2011-8-15 23:53:35 | 显示全部楼层
把它看做矩阵,即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技术 +1 收起 理由
else + 1 好深入

查看全部评分

发表于 2011-8-16 00:56:08 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
else + 1 又见步进

查看全部评分

 楼主| 发表于 2011-8-16 08:39:24 | 显示全部楼层
plp626连公式都搞出来了,真牛人一个
发表于 2011-8-16 09:32:51 | 显示全部楼层
我现在超烂的~ 重在参与啦

  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技术 +1 收起 理由
else + 1 版主v5

查看全部评分

发表于 2011-8-16 13:02:42 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
ArdentMan + 1 牛人,就是代码难看点

查看全部评分

发表于 2011-8-18 08:36:10 | 显示全部楼层
希望各位高人在写代码时给新人们一个看懂代码的机会。。。
发表于 2011-8-18 10:53:59 | 显示全部楼层
我觉得去看懂代码也是一个学习的过程,开始不懂,然后试图搞懂,就会自己动手找资料,慢慢的接触的东西就多了(个人观点)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 22:34 , Processed in 0.035856 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表