我觉得楼上这种算法比较精妙哦:- @echo off&setlocal enabledelayedexpansion
- set x=8190
- for /l %%i in (1,1,14) do (
- set/a "n=(x+i)/2"
- set/a i=n
- )
- set/a n+=1
- echo %n% 等于 %x%
- pause
复制代码
8190除以2这样一直除下去得到的都是奇数,而在cmd中奇数n/2的话等于(n-1)/2,会有数字丢失。
所以如果我下面这种常规折半法开始set x=8190的话,算出来的字符串长度会比真实的少。
于是只好set x=8192这样一直除下去得到的都是偶数,就能得到正确结果。
但是楼上采用的公式就避免了这种情况,我数学不好,不知道这个公式叫什么名字.......
附:我所用的“常规”折半法:
- @echo off
- set x=8192
- for /f "delims=" %%i in (a.txt) do (
- set "str=%%i"
- SetLocal EnableDelayedExpansion
- for /l %%j in (1,1,14) do (
- for %%a in (!x!) do if "!str:~%%a!"=="" (set/a x/=2) else (set/a n+=x&set "str=!str:~%%a!"&set/a x/=2))
- set/a n+=1
- echo %%i !n!字符
- endlocal
- )
- pause
复制代码
[ 本帖最后由 wankoilz 于 2010-7-26 15:01 编辑 ] |