本帖最后由 求知路漫漫 于 2022-3-9 18:05 编辑
目的:对1和0组成的字符串,从左往右,如果出现0之后,不能出现1,测试通过,否则测试失败。想了两个方案,都总出问题,又解决不了,谢谢执教。
方案一。从左第一个起,一个一个截取,若出现数字0,将剩下的转换成数字,如果为0则成功,否则失败。代码如下:- set /p str=请输入32位由0,1组成的字符串
- setlocal enabledelayedexpansion
- for /L %%i in (0,1,31) do (
- ::逐次截取第一位
- set /a aa=!!str:~%%i,1!!
- if !aa! equ 0 (
- ::需要将剩余的字符串转换位十进制,否则数值超限
- call :2x10 %%str:~!i!%% cc
- if !cc! ==0 (goto :test1) else goto :test2
- )
- )
- endlocal
-
- echo 出现这个说明程序出错了,请检查代码!
- pause
-
- ::借用十进制转二进制函数
- :2x10 2进制转 10进制 @随风 @bbs.bathome.net (封装)
- @echo off&setlocal enabledelayedexpansion
- set /a nnn=1,num=0&set nn=&set "n=%~1"
- set "n=!n:0= 0!"&set "n=!n:1= 1!"
- for %%a in (!n!) do set "nn=%%a !nn!"
- for %%a in (!nn!) do set /a num+=%%a*nnn,nnn*=2
- endlocal&set %~2=%num%&goto :EOF
- :test1
- echo 测试通过
- pause
- :test2
- echo 测试失败
- pause
复制代码 方案二,使用goto从第一个字符循环到最后一个字符,如果1开头,数字变化两次则失败,如果0开头,数字变化一次就失败。代码如下:- @echo off
-
- set /p str=请输入32位由0,1组成的字符串
-
- set /a flag=next=1
- set /a first=%str:~0,1%
- setlocal enabledelayedexpansion
- if %first% equ 1 (
- :test1
- if !next! lss 32 (
- set /a aa=%str:~!next!,1%
- if !aa! equ 1 ((if !flag! equ 1 (set next+=1& goto :test1) else goto :end1) else (set /a flag=0&set /a next+=1 &goto:test1)) else (set /a flag=0&set /a next+=1&goto :test1)
- )else goto :endok) else (
- :test2
- if !next! lss 32 (
- set /a bb=%str:~%next%,1%
- if !bb! equ 1 (goto :end1) else (set /a next+=1&goto :test2)))
- :endok
- echo ok
- pause
- :end1
- echo fail
- pause
复制代码 愁死了
通过四楼兄弟的方案解决了问题,简洁高效,再次感谢。抽空继续修正自己的方案,解决问题才能进一步提高 |