本帖最后由 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
复制代码
|