呵,指点谈不上,说讨论更贴切些~~说实话,一维变量是我编出来的,官方没有这样的说法,举个例子,类似.%%a%%b我称它为二维的,而对比下 .%%a就是一维了。感觉这样说简炼些^_^
我的算法也就是兄所说的楼梯法,更确切些叫罗伯法。这是目前比较容易的构造方法了。我也一直在思考效率的提高问题,在目前的这个算法下,我也只想到把变量改为一维(暂称)的可以提高一些效率,我的代码在下面,还请兄帮忙测试或者改进下!- @echo off
- :begin
- setlocal enabledelayedexpansion
- color 0c
- cls
- echo.&echo 本程序功能为输出n阶幻方!
- echo.&echo 所谓n阶幻方:1-n^^2个数排为n行n列;
- echo.&echo 要求:横、竖、对角线相加和相同。
- echo.&echo 算法:loubere法
- echo.&set /p "n= 请输入方阵阶数(奇数):"
- echo !n!|findstr "^[1-9]*$">nul || (echo.& echo Non-Numberic & pause>nul & goto begin)
- set /a a=n%%2
- if !a! equ 0 echo.&echo Non-Odd & pause>nul & goto begin
- cls
- echo.&echo %time%
- set /a "sum=(1+n*n)*n/2"
- echo.&echo !n!阶幻方横、竖、对角线相加和为 !sum!
- echo.
- set /a square=n*n,i=1,j=(n+1)/2,loc=j
- set ".!loc!=1"
- for /l %%i in (2 1 !square!) do (
- set /a "i=(i-1)%%n,j=(j+1)%%n"
- if !i! equ 0 set /a i=n
- if !j! equ 0 set /a j=n
- set /a "loc=n*(i-1)+j"
- if defined .!loc! (
- set /a "i=(i+2)%%!n!,j=(j-1)%%n"
- if !i! equ 0 set /a i=n
- if !j! equ 0 set /a j=n
- set /a "loc=n*(i-1)+j"
- )
- set .!loc!=%%i
- rem echo i:!i!,j:!j!,loc:!loc!,.loc:%%i
- )
-
- call :unify
-
- for /l %%i in (1 1 !square!) do (
- set /a "c=%%i%%n"
- set "result=!result! !.%%i!"
- if !c! equ 0 echo !result!&set "result="
- )
- echo.&echo %time%&echo.
- pause>nul&endlocal&goto begin
-
- :unify
- for /l %%i in (1 1 !square!) do (
- if !.%%i! lss 10 set ".%%i= !.%%i!"
- if !n! gtr 10 (
- if !.%%i! lss 100 ( set ".%%i= !.%%i!")
- )
- )
- goto :eof
复制代码
|