文章目录
- 计算2的N次方
- 转二进制
- 最大公约数和最小公倍数
- 打印乘法表
计算2的N次方
二进制转换是经常遇到的一个需求,批处理可以非常便捷地完成这个工作。而二进制转化过程中,第一步就是和 2 n 2^n 2n比较大小,所以在实现这个功能之前,不妨实现一个计算2的n次方的功能,同时也给出整个批处理程序的框架。
代码如下
@echo off
:start
echo ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
echo ┃ 输入0 退出
echo ┃ 输入1 计算2的n次方
echo ┃ 输入2 二进制转换
echo ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
set /P Mode=请输入计算模式:
if %Mode%==0 (
goto :eof
)else if %Mode%==1 (
goto :Mode1
)else if %Mode%==2 (
goto :Mode2
)else (
goto :eof
)
:Mode1
set /P N=请输入一个数字:
set /a NN=1"<<"%N%
echo 2的%N%次方等于%NN%
pause
goto :start
首先,关闭回显;然后来一个start标签,每次计算完成之后,都要回到这个标签处。
然后输入模式,当输入1的时候,跳转到标签Mode1,而Mode1的功能就是计算2的N次方。当计算完成之后,输出计算结果,然后等待一下,最后跳转到开始的start。
效果如下
转二进制
接下来的计算代码,可以直接写在标签:Mode2中。
转二进制的逻辑就是,从高位到低位,对输入数值和 2 n 2^n 2n做比较,如果大于 2 n 2^n 2n,那么第 n n n位就设为1,同时减去 2 n 2^n 2n,否则这一位就是0。由于批处理的数字实质上是有符号的32位整型,所以能够转换的最大整数就是 2 31 − 1 2^{31}-1 231−1。
代码如下
:Mode2
setlocal enabledelayedexpansion
set /P N=请输入一个数字:
set str=0b
for /L %%i in (30, -1, 0)do (
set /a div=1"<<"%%i
if !N! geq !div! (
set /a N=!N!-!div!
set str=!str!1
)else (
set str=!str!0
)
)
echo 二进制转化结果:%str%
pause
goto:start
结果如下
最大公约数和最小公倍数
辗转相除法可以说十分经典了
:Mode3
set/p a=输入第一个数
set/p b=输入第二个数
set/a ab=%a%*%b%
set str= %a%和%b%的
:gcdloop
set/a num2=%a%%%b%
if %num2% gtr 0 set/a a=%b%&set/a b=%num2%&goto gcdloop
set /a num=%ab%/%b%
echo %str%最大公约数为%b%;最小公倍数为%num%
pause
goto:start
打印乘法表
打印乘法表的时候有个问题,就是echo完事儿之后是默认要回车的,所以每次做完乘法之后,若直接echo出去,那就做不出来所谓的“表”了,为了能真正打印出一张表,所以用P模式的set命令来进行输入。
而且貌似批处理没法单独打印空格或者制表位,所以在制表位前面加个小数点,最后得到的乘法表就像下面这样
代码如下
:: 模式4 打印乘法表
:Mode4
SETLOCAL ENABLEDELAYEDEXPANSION
set line=━━━━━━━━━━━━━━━━━━━━━━━
echo ┏%line%%line%%line%━━┓
for /L %%i in (1,1,9) do (
set /p="┃ " < nul
for /L %%j in (1,1,%%i) do (
set /a h=%%i*%%j
set /p =%%i×%%j^=!h! <nul
)
for /L %%j in (%%i,1,8) do (
set /p =. <nul
)
echo ┃
)
echo ┗%line%%line%%line%━━┛
pause
goto:start