复制代码
- @echo off & SetLocal EnableDelayedExpansion
- ::变量c的值是被开方数,不得超过1000!
- set c=2
- for %%a in (16 8 4 2 1) do (
- set /a "d=(a*%%a<<1)+%%a*%%a+b"
- if !c! geq !d! set /a "a+=%%a","b=d"
- )
- if !b! equ !c! echo !a! & pause & exit /b
- set /p "=!a!."<nul
- set "d=0"
- for %%a in (512 256 128 64 32 16 8 4 2 1) do (
- set /a "d+=%%a","e=((a*d<<1)+d*d/1000)/1000+b"
- if !e! geq !c! set /a "d-=%%a"
- )
- set "e=00!d!" & set /p "=!e:~-3!"<nul
- set /a "e=(!a!!e:~-3!*!a!!e:~-3!)%%1000000","b=e/1000","e=e%%1000"
- set "e= !e!" & set "e=!e:~-3!"
- set "b=000!e!!b!"
- set "e= !d!"
- set "a=!e:~-3!!a!"
- for /l %%a in (3 3 2147483646) do (
- set "d=0"
- for %%b in (512 256 128 64 32 16 8 4 2 1) do (
- set /a "d+=%%b"
- if 1000 gtr !d! (
- set /a "c=d*d/1000"
- for /l %%c in (0 3 %%a) do set /a "c=((!a:~%%c,3!*d<<1)+c+!b:~%%c,3!)/1000"
- set /a "e=%%a+3"
- for %%c in (!e!) do set /a "c+=!b:~%%c,3!" & if !c! geq 1000 set /a "d-=%%b"
- ) else set /a "d-=%%b"
- )
- set "e=00!d!" & set /p "=!e:~-3!"<nul
- set "c=" & set /a "f=d*d/1000"
- for /l %%b in (0 3 %%a) do (
- set /a "e=(!a:~%%b,3!*d<<1)+!b:~%%b,3!+f","f=e/1000","e%%=1000"
- set "e= !e!" & set "c=!c!!e:~-3!"
- )
- set /a "e=(d*d)%%1000" & set "e= !e!" & set "b=000!e:~-3!!c!"
- set "e= !d!" & set "a=!e:~-3!!a!"
- )
- echo. & pause & exit /b
这个 :next 代码块是用来获取被开方数的,不妨命名为 :GetNum 或者 :get_number复制代码
- :next
- cls
- if "%number%"=="" goto start
- set /a temp=%number%+0
- if not "%temp%"=="%number%" goto error_a
- if not %number% geq 0 goto error_b
- if %number% geq 2147483647 goto error_c
- goto then
:then 代码块是用来输入精度的,不妨命名为 :set_precision (找谷歌翻译的)复制代码
- :then
- cls
- echo.&echo 请输入精确位数,然后按回车键:
- echo (指精确到小数点后第几位)
- echo (该程序不会对最后一位进行四舍五入)
- echo (精确位数最高为238609294,超出范围,会计算出错)
- echo (对于结果为整数的,程序会舍去小数部分)
- set bit=
- set /p "bit="
- goto other
:start echo.&echo 请输入被开方数(仅限整数),然后按回车键: echo (被开方数最高为2147483646,超出范围,会计算出错) set number= set /p "number=" goto get_number :get_number cls if "%number%"=="" goto start set /a temp=%number%+0 if not "%temp%"=="%number%" goto error_a if not %number% geq 0 goto error_b if %number% geq 2147483647 goto error_c goto set_precision :set_precision cls echo.&echo 请输入精确位数,然后按回车键: echo (指精确到小数点后第几位) echo (该程序不会对最后一位进行四舍五入) echo (精确位数最高为238609294,超出范围,会计算出错) echo (对于结果为整数的,程序会舍去小数部分) set bit= set /p "bit=" goto chk_precision :chk_precision cls if "%bit%"=="" goto then set /a temp=%bit%+0 if not "%bit%"=="%temp%" goto error_d if not %bit% geq 0 goto error_d if %bit% geq 238609295 goto error_e set start=yes goto main |
:save_and_exit if "%bit%"=="0" ( set info=(保留整数) ) else ( set info=(精确到小数点后第%bit%位) ) cd /d "%UserProfile%\desktop" set fname="%number%的平方根的结果%info%.txt" rem 若存在同名文件,获取权限 if exist %fname% takeown %fname% >%fname% ( echo %number%的平方根的结果: echo %info%: echo (未对其结果进行四舍五入): echo %nun% ) goto exit |
因为末尾的值是序列递增的,在创建列表的时候甚至可以用for,进一步缩减代码(同上面理由一样,放在初始化函数中不会有什么效率影响),但是不建议这么做因为可读性超差复制代码
- :kfmain
- set /a u+=1
- rem 设置常量映射表
- set ER_2m=1
- set ER_5m=2
- set ER_4m=3
- set ER_2l=4
- set U_1=5
- set ER_7m=6
- set ER_5l=7
- set ER_9m=8
- set ER_7l=9
- if defined ER_%er% (
- set %kfmain%=!ER_%er%!
- goto bignum_mp
- )
- if defined U_%u% (
- set %kfmain%=!U_%u%!
- goto bignum_mp
- )
- if "%er%"=="1m" set temp=0
- if "%er%"=="1l" set temp=1
- if "%er%"=="3m" set temp=2
- if "%er%"=="3l" set temp=3
- if "%er%"=="4l" set temp=4
- if "%er%"=="6m" set temp=5
- if "%er%"=="6l" set temp=6
- if "%er%"=="8m" set temp=7
- if "%er%"=="8l" set temp=8
- if "%er%"=="9l" set temp=9
- goto :eof
um... bignum_mp 就是 bignum multiply 的意思复制代码
- :kfmain
- set /a u+=1
- rem 设置常量映射表
- set /a iter = 1
- for %%a in ( E_2m E_5m E_4m E_2l U_1 E_7m E_5l E_9m E_7l ) do (
- set /a %%a=iter, iter+=1
- )
- set /a iter = 0
- for %%a in ( 1m 1l 3m 3l 4l 6m 6l 8m 8l 9l ) do (
- set /a T_%%a=iter, iter+=1
- )
- if defined E_%er% (
- set /a %kfmain% = E_%er%
- goto bignum_mp
- )
- if defined U_%u% (
- set /a %kfmain% = U_%u%
- goto bignum_mp
- )
- if defined T_%er% set /a temp=T_%er%
- goto :eof
复制代码
- @echo off
- set test_num=314159
- set temp_str=%test_num%fedcba9876543210
- set /a len=0x%temp_str:~15,1%
- echo %len%
复制代码
- :: Bignum(integer) Square Root
- :: 523066680/vicyang
- :: 2018-12
- @echo off
- setlocal enabledelayedexpansion
- :init
- rem template for counting string length
- set mod=
- set /a maxlen=2000, half=maxlen/2
- for /l %%a in (1,1,%half%) do set mod=!mod!##
- set time_a=%time%
- set num=123456787654322
- rem set num=10
- call :get_int_of_root %num% int_root cmp
- if %cmp% equ 0 (
- set root=%int_root%
- echo num = %num%, root = !root!, !cmp!
- exit /b
- )
- set precision=80
- call :check_first %num% %precision%
- call :get_dec_of_root %num% %int_root% %precision% dec_root
- call :time_used %time_a% %time%
- exit /b
- :check_first
- perl -Mbignum=p,-%2 -le "print sqrt(%1)" 2>nul
- goto :eof
- :get_dec_of_root
- setlocal
- set num=%1
- set int_root=%2
- set precision=%3
- set root=%int_root%
- rem Show int_root first
- set /p inp="%int_root%."<nul
- call :bignum_mp %root% %root% prev_pow
- set /a dec_len=0
- :decroot_lp
- set /a min=0, max=10, mid=(max+min)/2, quit = 0, dec_len+=1
- :decroot_bin_search
- rem calc [a*10]^2 + 2*[a*10]*b + b^2, part1 part2 part3
- set /a sum = 0
- set part1=%prev_pow%00
- set /a part3 = mid * mid
- set /a double_mid = mid * 2
- call :bignum_mp %root%0 %double_mid% part2
- call :bignum_plus %part1% %part2% sum
- call :bignum_plus %sum% %part3% sum
- rem compare
- call :cmp %sum% %num%00 cmp
- rem echo %root%%mid% %sum% %num%00 min:%min% max:%max% %cmp%
- set /a range=max-min
- if %cmp% gtr 0 ( set /a max=mid )
- if %cmp% lss 0 ( set /a min=mid )
- if %cmp% equ 0 ( set /a quit=1 )
- if %range% leq 1 ( set /a quit=1 )
- set /a mid=(max+min)/2
- if %quit% equ 0 goto :decroot_bin_search
- set prev_pow=%sum%
- set root=%root%%mid%
- set num=%num%00
- set /p inp="%mid%"<nul
- if %dec_len% lss %precision% goto :decroot_lp
- echo,
- endlocal
- goto :eof
- :get_int_of_root
- rem get the integer part of root
- setlocal
- set num=%1
- call :length %num% len
- rem initial min and max number
- set /a min = 1, max = 10, root_len = len / 2 + len %% 2
- for /l %%n in (2,1,%root_len%) do (set min=!min!0& set max=!max!9)
- call :bignum_plus %min% %max% sum
- rem middle_number = sum / 2
- call :bignum_div_single %sum% 2 mid
- set /a quit = 0
- :binary_search
- call :bignum_mp %mid% %mid% product
- call :cmp %product% %num% cmp
- call :bignum_minus %max% %min% range
- if !cmp! equ 0 (
- set /a quit = 1, cmp=0
- ) else (
- if !cmp! gtr 0 (
- set max=!mid!
- set cmp=1
- )
- if !cmp! lss 0 (
- set min=!mid!
- set cmp=-1
- )
- call :bignum_plus !max! !min! sum
- call :bignum_div_single !sum! 2 mid
- rem Using !var!, because we are inside the brackets
- )
- if %range% leq 1 (set quit=1)
- if %quit% == 0 goto :binary_search
- endlocal &set %2=%mid%& set %3=%cmp%
- goto :eof
- :bignum_mp
- setlocal
- set num_a=%1
- set num_b=%2
- call :length %num_a% len_a
- call :length %num_b% len_b
- for /l %%b in ( 1, 1, %len_b% ) do ( set ele_b=!ele_b! !num_b:~-%%b,1! )
- for /l %%a in ( 1, 1, %len_a% ) do ( set ele_a=!ele_a! !num_a:~-%%a,1! )
- rem for /l %%a in (0, 1, %attemplen%) do set buff[%%a]=0
- set /a id = 0, sid = 0, maxid = 0
- for %%b in ( %ele_b% ) do (
- set /a sid = id, id += 1
- for %%a in ( %ele_a% ) do (
- set /a buff[!sid!] += %%a * %%b, sid += 1, maxid = sid
- )
- )
- rem Merge
- set /a id = 0
- for /l %%c in ( 0, 1, %maxid% ) do (
- set /a next = %%c+1
- set /a buff[!next!] += buff[%%c]/10, buff[%%c] = buff[%%c] %% 10
- )
- if "!buff[%maxid%]!" == "0" set /a maxid-=1
- set product=
- for /l %%n in (%maxid%, -1, 0) do set product=!product!!buff[%%n]!
- endlocal &set %3=%product%
- goto :eof
- :bignum_plus
- setlocal
- set num_a=%1
- set num_b=%2
- call :length %num_a% len_a
- call :length %num_b% len_b
- set /a max = len_a
- if %len_b% gtr %len_a% (set /a max=len_b, len_b=len_a&set num_a=%num_b%&set num_b=%num_a%)
- for /l %%n in ( 1, 1, %max% ) do (
- if %%n leq %len_b% (
- set /a buff[%%n] = !num_a:~-%%n,1! + !num_b:~-%%n,1!
- ) else (
- set buff[%%n]=!num_a:~-%%n,1!
- )
- )
- set /a id = 0
- for /l %%c in ( 0, 1, %max% ) do (
- set /a next = %%c+1
- set /a buff[!next!] += buff[%%c]/10, buff[%%c] = buff[%%c] %% 10
- )
- if "!buff[%next%]!" gtr "0" set /a max+=1
- set sum=
- for /l %%a in (%max%, -1, 1) do set sum=!sum!!buff[%%a]!
- endlocal &set %3=%sum%
- goto :eof
- :bignum_minus
- setlocal
- set num_a=%1
- set num_b=%2
- call :length %num_a% len_a
- call :length %num_b% len_b
- set /a max = len_a
- if %len_b% gtr %len_a% (set /a max=len_b, len_b=len_a&set num_a=%num_b%&set num_b=%num_a%)
- set /a minus = 0
- for /l %%n in ( 1, 1, %max% ) do (
- if %%n leq %len_b% (
- set /a dt = !num_a:~-%%n,1! - !num_b:~-%%n,1! - minus
- ) else (
- set /a dt = !num_a:~-%%n,1! - minus
- )
- if !dt! lss 0 (
- set /a buff[%%n] = dt + 10, minus=1
- ) else (
- set /a buff[%%n] = dt, minus=0
- )
- )
- set delta=#
- for /l %%a in (%max%, -1, 1) do set delta=!delta:#0=#!!buff[%%a]!
- endlocal &set %3=%delta:#=%
- goto :eof
- :bignum_div_single
- setlocal
- set num_a=%1
- set num_b=%2
- call :length %num_a% len_a
- set /a max = len_a, mod = 0
- for /l %%n in ( %len_a%, -1, 1 ) do (
- set /a e = !num_a:~-%%n,1! + mod*10
- set /a buff[%%n] = e/num_b, mod = e %% num_b
- )
- if !buff[%max%]! == 0 (set /a max-=1)
- set quotaint=
- for /l %%a in (%max%, -1, 1) do set quotaint=!quotaint!!buff[%%a]!
- endlocal &set %3=%quotaint%
- goto :eof
- :length %str% %vname%
- setlocal
- set test=%~1_%mod%
- set test=!test:~0,%maxlen%!
- set test=%test:*_=%
- set /a len=maxlen-(%test:#=1+%1)
- endlocal &set %2=%len%
- goto :eof
- :cmp %str1% %str2% %vname%
- setlocal
- call :length %1 len_a
- call :length %2 len_b
- if %len_a% gtr %len_b% (endlocal &set %3=1&goto :eof)
- if %len_a% lss %len_b% (endlocal &set %3=-1&goto :eof)
- set str1=%1
- set str2=%2
- if %len_a% equ %len_b% (
- for /l %%n in (0, 1, %len_a%) do (
- if "!str1:~%%n,1!" gtr "!str2:~%%n,1!" (endlocal &set %3=1&goto :eof)
- if "!str1:~%%n,1!" lss "!str2:~%%n,1!" (endlocal &set %3=-1&goto :eof)
- )
- endlocal &set %3=0
- )
- goto :eof
- :time_used %time_a% %time_b%
- rem only for few seconds, not consider minutes
- setlocal
- set ta=%1& set tb=%2
- rem insert 1 befeore 00.00 if first num is zero
- set ta=1%ta:~-5%
- set tb=1%tb:~-5%
- set /a dt = %tb:.=% - %ta:.=%
- set dt=%dt:-=%
- set dt=0000%dt%
- set dt=%dt:~-4%
- echo time used: %dt:~0,2%.%dt:~2,2%s
- endlocal
- goto :eof
就是你这程序有点bug,计算1099511627776的平方根,为啥不一会就退出了
还有我看了半天也不明白你的精确位数在那设置的,每次算到80位就退出了
输出:复制代码
- use utf8;
- use Encode;
- my $inp='%&@^"\'?,;<>|\/:() !=';
- # 反斜杠因为是剔除而不是替换,用s///处理
- $inp=~s/\\//g;
- $inp=~tr/%&@^"\'?,;<>|\/:() !=/abcdefghijkl÷÷[]\\mn/;
- print encode('gbk', $inp);
abcdefghijkl÷÷[]\mn
输出复制代码
- my $inp=<DATA>;
- my ($from, $to) = <DATA>;
- eval "\$inp=~tr/\Q$from\E/\Q$to\E/" or die "$!";
- print $inp;
- __DATA__
- %&@^"'?,;<>|/:() !=\_._\,;=_;=_%_\"=\
- %&@^"'?,;<>|/:() !=\_.
- abcdefghijklmnopqrst +
abcdefghijklmnopqrst + this is a test
一开始还在想为啥用前面的结果*2作为基础 (2 28 282),一计算发现还是那个平方公式展开的结果,这个方法更进一步,又省去了一些计算量,所以速度更快。复制代码
- Find the square root of 2.
- 1. 4 1 4 2
- _______________
- \/ 02.00 00 00 00
- 02 1*1 <= 2 < 2*2 x = 1
- 01 y = x*x = 1*1 = 1
- 01 00 24*4 <= 100 < 25*5 x = 4
- 00 96 y = (20+x)*x = 24*4 = 96
- 04 00 281*1 <= 400 < 282*2 x = 1
- 02 81 y = (280+x)*x = 281*1 = 281
- 01 19 00 2824*4 <= 11900 < 2825*5 x = 4
- 01 12 96 y = (2820+x)*x = 2824*4 = 11296
- 06 04 00 28282*2 <= 60400 < 28283*3 x = 2
- The desired precision is achieved:
- The square root of 2 is about 1.4142
默认是F7运行,如果批处理包含中文(GBK编码),安装 GBK Support 插件。复制代码
- {
- "cmd": ["$file"],
- "file_regex": ".* at (.*) line ([0-9]*)",
- "selector": "source.dosbatch",
- "encoding": "cp936"
- }
输出:复制代码
- use Encode;
- use File::Slurp;
- STDOUT->autoflush(1);
- my $src = read_file( "sample.bat" );
- my @lines = split(/\r?\n/, $src);
- my $in = 0;
- for my $line ( @lines )
- {
- if ( $line=~/\)(\s*)$/ ) { $in -= 4; }
- if ( $line=~/\)\s+else\s+\(/ ) { $in -= 4; }
- printf "%s%s\n", " "x$in, $line;
- if ( $line=~/\((\s*)$/ ) { $in += 4; }
- }
复制代码
- @echo off&SetLocal EnableDelayedExpansion
- color f0
- set number=2
- rem 设置被开方数(number)(不超过20)(别输入正好能开出来的)
- set num=1
- rem 输入被开方数的整数部分(num)
- echo ------------------------
- echo 计算!number!的平方根的值
- echo ------------------------
- set nun=!num!
- set /a bv=!number!-(!num!*!num!)+!num!
- set q[4]=0000
- set q[2]=00
- set q[1]=0
- set /p=!num!.<nul
- set zz=-5
- for /l %%a in (0 1 110) do (
- set /a zz+=6
- set temp=0
- for %%b in (512 256 128 64 32 16 8 4 2 1) do (
- set /a temp+=%%b
- set /a c=%%a/2+1
- set d=!num!
- for /l %%c in (1 1 !c!) do (
- set o=!d:~-6!
- if not defined o set o=0
- for %%f in (4 2 1) do (
- if "!o:~0,%%f!"=="!q[%%f]!" (
- set o=!o:~%%f!
- if not defined o set o=0
- )
- )
- set /a "b[%%c]=!o!*!temp!<<1"
- set d=!d:~0,-6!
- )
- set /a y=!temp!*!temp!
- set /a b[1]+=!y!/1000
- for /l %%c in (!c! -1 1) do (
- set /a d=%%c+1
- set /a b[!d!]+=!b[%%c]!/1000000
- )
- set h=!a!
- set a=
- for /l %%c in (1 1 !c!) do (
- if not !c!==%%c (
- set /a b[%%c]=!b[%%c]!%%1000000
- if !b[%%c]! lss 100000 (
- if !b[%%c]! lss 10000 (
- if !b[%%c]! lss 1000 (
- if !b[%%c]! lss 100 (
- if !b[%%c]! lss 10 (
- set b[%%c]=00000!b[%%c]!
- ) else (
- set b[%%c]=0000!b[%%c]!
- )
- ) else (
- set b[%%c]=000!b[%%c]!
- )
- ) else (
- set b[%%c]=00!b[%%c]!
- )
- ) else (
- set b[%%c]=0!b[%%c]!
- )
- )
- )
- set a=!b[%%c]!!a!
- )
- set z=!b!
- set i=!a:~0,-3!
- if not defined i set i=0
- set x=!nun!
- set /a v=!zz!/9+1
- for /l %%v in (1 1 !v!) do (
- set u=!i:~-9!
- set w=!x:~-9!
- for %%f in (4 2 1) do (
- if "!u:~0,%%f!"=="!q[%%f]!" set u=!u:~%%f!
- if not defined u set u=0
- )
- for %%f in (4 2 1) do (
- if "!w:~0,%%f!"=="!q[%%f]!" set w=!w:~%%f!
- if not defined w set w=0
- )
- set /a k[%%v]=!u!+!w!
- set i=!i:~0,-9!
- set x=!x:~0,-9!
- if not defined i set i=0
- if not defined x set x=0
- )
- for /l %%v in (1 1 !v!) do (
- set /a i=%%v+1
- set /a k[!i!]+=!k[%%v]!/1000000000
- )
- set b=
- for /l %%v in (1 1 !v!) do (
- if not "%%v"=="!v!" (
- set /a k[%%v]=!k[%%v]!%%1000000000
- if !k[%%v]! lss 100000000 (
- if !k[%%v]! lss 10000000 (
- if !k[%%v]! lss 1000000 (
- if !k[%%v]! lss 100000 (
- if !k[%%v]! lss 10000 (
- if !k[%%v]! lss 1000 (
- if !k[%%v]! lss 100 (
- if !k[%%v]! lss 10 (
- set k[%%v]=00000000!k[%%v]!
- ) else (
- set k[%%v]=0000000!k[%%v]!
- )
- ) else (
- set k[%%v]=000000!k[%%v]!
- )
- ) else (
- set k[%%v]=00000!k[%%v]!
- )
- ) else (
- set k[%%v]=0000!k[%%v]!
- )
- ) else (
- set k[%%v]=000!k[%%v]!
- )
- ) else (
- set k[%%v]=00!k[%%v]!
- )
- ) else (
- set k[%%v]=0!k[%%v]!
- )
- )
- ) else (
- if "!k[%%v]!"=="0" set k[%%v]=
- )
- set b=!k[%%v]!!b!
- )
- set ew=!b:~0,1!
- if !ew! geq !bv! (
- set /a temp-=%%b
- set b=!z!
- set a=!h!
- )
- )
- set /a g=!temp!*!temp!
- set /a g=!g!%%1000
- if !g! lss 100 (
- if !g! lss 10 (
- set nun=!b!!a:~-3!00!g!
- ) else (
- set nun=!b!!a:~-3!0!g!
- )
- ) else (
- set nun=!b!!a:~-3!!g!
- )
- if !temp! lss 100 (
- if !temp! lss 10 (
- set /p=00!temp! <nul
- set num=!num!00!temp!
- ) else (
- set /p=0!temp! <nul
- set num=!num!0!temp!
- )
- ) else (
- set /p=!temp! <nul
- set num=!num!!temp!
- )
- set a=0
- set y=0
- set r=!nun!
- )
- pause
- exit /b
bug修正版复制代码
- :s
- set /a a=%1,b=a/2
- for /l %%a in (1,1,15) do set /a b=(b+a/b)/2
- exit /b %b%
复制代码
- 修正bug版
- :s
- if "#%1"=="#" echo 未输入&set b=&exit /b
- set /a a=%1,b=a/2
- if "%a:~0,1%"=="-" echo 负数&set b=&exit /b
- if "%a%"=="0" set b=0&exit /b 0
- for /l %%a in (1,1,15) do set /a b=(b+a/b)/2
- exit /b %b%
复制代码
- :: Bignum(integer) Square Root, Decimal Solution
- :: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Decimal_(base_10)
- :: 523066680/vicyang
- :: 2019-01
- @echo off
- setlocal enabledelayedexpansion
- :init
- rem 创建用于计算字符串长度的模板,长度限制为 2^pow
- set "sharp=#"
- set /a pow=11, maxlen=1^<^<pow
- for /l %%a in (1,1,%pow%) do set sharp=!sharp!!sharp!
- set num=2
- rem set num=10
- rem call :get_int_of_root %num% int_root cmp
- set precision=80
- rem call :check_first %num% %precision%
- call :decimal_solution %num%
- pause
- exit /b
- :check_first
- perl -Mbignum=p,-%2 -le "print sqrt(%1)" 2>nul
- goto :eof
- :: 手算开根方案
- :decimal_solution
- setlocal
- set num=%1
- set tnum=%1
- call :length %num% len
- set /a mod=len %% 2, tlen=len, base=0
- if %mod% equ 1 (set /a skip=1) else (set /a skip=2)
- set target=!tnum:~0,%skip%!
- set tnum=!tnum:~%skip%!
- set mp_0=0
- rem prec 精度
- set /a prec = 0
- set /a tbase_len = 0, equ = 0
- :dec_loop
- set /a min=0, max=10, mid=5, range=max-min, quit=0, equ=0
- set /a tbase_len+=1
- call :length %target% target_len
- :: 预估下一个可能的数,并限制二分搜索的最大值
- :guess
- if %target_len% gtr 3 (
- if %target_len% equ %tbase_len% (
- set /a t_head = %target:~0,2%, b_head = %base:~0,2%
- ) else (
- set /a t_head = %target:~0,3%, b_head = %base:~0,2%
- )
- ) else (goto :out_of_guess)
- for /l %%a in (0,1,9) do (
- set /a t = %%a * b_head
- rem echo !t! !target:~0,2! %%a
- if !t! gtr %t_head% (
- set /a max = %%a, mid = ^(min+max^)/2
- goto :out_of_guess
- )
- )
- :out_of_guess
- rem echo, &echo %base%%mid% %target% %tbase_len% %target_len% max: %max%
- :dec_bin_search
- :: mp = [base*10+mid] * mid
- if "%base%" == "0" (
- set /a tbase = mid
- ) else (
- set tbase=!base!!mid!
- )
- set ta=%time%
- call :bignum_mp %tbase% %mid% %tbase_len% 1 mp mp_len
- set mp_%mid%=%mp%
- set mplen_%mid%=%mp_len%
- rem call :cmp %mp% %target% %mp_len% %target_len% cmp
- :: 比较 - 判断是否超出
- :cmp_begin
- if %mp_len% gtr %target_len% (set /a cmp=1&goto :cmp_end)
- if %mp_len% lss %target_len% (set /a cmp=-1&goto :cmp_end)
- :: 如果长度相同,直接按字符串对比
- if "%mp%" gtr "%target%" (set /a cmp=1&goto :cmp_end)
- if "%mp%" lss "%target%" (set /a cmp=-1&goto :cmp_end)
- if "%mp%" equ "%target%" (set /a cmp=0&goto :cmp_end)
- :cmp_end
- rem call :time_delta %ta% %time% bs_tu
- if %cmp% equ 0 (set /a quit=1, equ=1)
- if %cmp% equ 1 (set /a max=mid )
- if %cmp% equ -1 (set /a min=mid )
- if %range% leq 1 ( set /a quit=1 )
- set /a mid=(max+min)/2, range=max-mid
- if %quit% == 0 goto :dec_bin_search
- set ta=%time%
- set /p inp="%mid%"<nul
- rem echo, &echo tnum %tnum%, cmp %cmp%, equ %equ%, tg %target%
- if "%tnum%" == "" (
- if %cmp% == 0 (
- goto :dec_loop_out
- ) else (
- rem current precision
- if %prec% equ 0 set /p inp="."<nul
- set /a prec+=1
- )
- )
- rem echo b=%base% tb=%tbase% tg=%target% mp=%mp% mid=%mid%
- call :bignum_minus %target% !mp_%mid%! target
- if %skip% geq %len% (
- set target=%target%00
- ) else (
- if "%target%" == "0" (
- set target=!tnum:~0,2!
- ) else (
- set target=!target!!tnum:~0,2!
- )
- set tnum=!tnum:~2!
- set /a skip+=2
- )
- rem base=base*10+mid*2
- if "%base%" == "0" (
- set /a base=mid*2
- ) else (
- set /a db_mid=mid*2
- call :bignum_plus !base!0 !db_mid! base
- )
- rem call :time_delta %ta% %time% else_tu
- if %prec% leq %precision% (goto :dec_loop)
- :dec_loop_out
- endlocal
- goto :eof
- ::大数乘法
- :bignum_mp
- setlocal
- set num_a=%1
- set num_b=%2
- set /a len_a=%3, len_b=%4
- for /l %%b in ( 1, 1, %len_b% ) do ( set ele_b=!ele_b! !num_b:~-%%b,1! )
- for /l %%a in ( 1, 1, %len_a% ) do ( set ele_a=!ele_a! !num_a:~-%%a,1! )
- set /a id = 0, sid = 0, maxid = 0
- for %%b in ( %ele_b% ) do (
- set /a sid = id, id += 1
- for %%a in ( %ele_a% ) do (
- set /a buff[!sid!] += %%a * %%b, sid += 1, maxid = sid
- )
- )
- rem Merge
- set /a id = 0
- for /l %%c in ( 0, 1, %maxid% ) do (
- set /a next = %%c+1
- set /a buff[!next!] += buff[%%c]/10, buff[%%c] = buff[%%c] %% 10
- )
- if "!buff[%maxid%]!" == "0" set /a maxid-=1
- set product=
- for /l %%n in (%maxid%, -1, 0) do set product=!product!!buff[%%n]!
- endlocal &set %5=%product%&set /a %6=%maxid%+1
- goto :eof
- ::大数加法
- :bignum_plus
- setlocal
- set num_a=%1
- set num_b=%2
- call :length %num_a% len_a
- call :length %num_b% len_b
- set /a max = len_a
- if %len_b% gtr %len_a% (set /a max=len_b, len_b=len_a&set num_a=%num_b%&set num_b=%num_a%)
- for /l %%n in ( 1, 1, %max% ) do (
- if %%n leq %len_b% (
- set /a buff[%%n] = !num_a:~-%%n,1! + !num_b:~-%%n,1!
- ) else (
- set buff[%%n]=!num_a:~-%%n,1!
- )
- )
- set /a id = 0
- for /l %%c in ( 0, 1, %max% ) do (
- set /a next = %%c+1
- set /a buff[!next!] += buff[%%c]/10, buff[%%c] = buff[%%c] %% 10
- )
- if "!buff[%next%]!" gtr "0" set /a max+=1
- set sum=
- for /l %%a in (%max%, -1, 1) do set sum=!sum!!buff[%%a]!
- endlocal &set %3=%sum%
- goto :eof
- ::大数减法
- :bignum_minus
- setlocal
- set num_a=%1
- set num_b=%2
- call :length %num_a% len_a
- call :length %num_b% len_b
- set /a max = len_a
- if %len_b% gtr %len_a% (set /a max=len_b, len_b=len_a&set num_a=%num_b%&set num_b=%num_a%)
- set /a minus = 0
- for /l %%n in ( 1, 1, %max% ) do (
- if %%n leq %len_b% (
- set /a dt = !num_a:~-%%n,1! - !num_b:~-%%n,1! - minus
- ) else (
- set /a dt = !num_a:~-%%n,1! - minus
- )
- if !dt! lss 0 (
- set /a buff[%%n] = dt + 10, minus=1
- ) else (
- set /a buff[%%n] = dt, minus=0
- )
- )
- set delta=#
- for /l %%a in (%max%, -1, 1) do set delta=!delta:#0=#!!buff[%%a]!
- endlocal &set %3=%delta:#=%
- goto :eof
- ::字符串长度计算
- :length %str% %vname%
- setlocal
- set test=%~1_%sharp%
- set test=!test:~0,%maxlen%!
- set test=%test:*_=%
- set /a len=maxlen-(%test:#=1+%1)
- endlocal &set %2=%len%
- goto :eof
- :: plp626的时间差函数 时间跨度在1分钟内可调用之;用于测试一般bat运行时间
- :time_delta <beginTimeVar> <endTimeVar> <retVar> // code by plp626
- setlocal
- set ta=%1&set tb=%2
- set /a "c=1!tb:~-5,2!!tb:~-2!-1!ta:~-5,2!!ta:~-2!,c+=-6000*(c>>31)"
- if defined %3 set /a c+=!%3!
- endlocal&set %3=%c%
- goto:eof
复制代码
- :: Bignum(integer) Square Root, Decimal Solution
- :: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Decimal_(base_10)
- :: 523066680/vicyang
- :: 2019-01
- @echo off
- setlocal enabledelayedexpansion
- :init
- rem 创建用于计算字符串长度的模板,长度限制为 2^pow
- set "sharp=#"
- set /a pow=11, maxlen=1^<^<pow
- for /l %%a in (1,1,%pow%) do set sharp=!sharp!!sharp!
- set precision=80
- set num=2
- call :check_one %num%
- pause
- exit /b
- :: 独立测试
- :check_one
- set ta=!time!
- rem call :check_first %1 !precision!
- call :decimal_solution %1
- call :time_delta !ta! !time! tu
- echo time used: !tu!
- goto :eof
- :: 批量测试
- :check_all
- for /l %%a in (1,1,99) do (
- echo test number: %%a
- call :check_first %%a !precision!
- call :decimal_solution %%a
- echo,
- )
- goto :eof
- :: 使用其他工具校验/对比结果
- :check_first
- perl -Mbignum=p,-%2 -le "print sqrt(%1)" 2>nul
- goto :eof
- :: 手算开根方案
- :decimal_solution
- setlocal
- set num=%1
- set tnum=%1
- call :length %num% len
- set /a mod=len %% 2, tlen=len, base=0
- if %mod% equ 1 (set /a skip=1) else (set /a skip=2)
- set target=!tnum:~0,%skip%!
- set tnum=!tnum:~%skip%!
- set /a mp_0=0, mplen_0=1
- set /a bstimes=0
- rem prec 当前精度
- set /a prec = 0
- set /a base_len=0, equ=0, target_len=skip
- :dec_loop
- set /a min=0, max=10, mid=5, range=max-min, quit=0, equ=0
- set /a tbase_len=base_len+1
- :: 评估二分搜索的最大值
- :guess
- if %target_len% gtr 3 (
- if %target_len% equ %tbase_len% (
- set /a t_head = %target:~0,2%, b_head = %base:~0,2%
- ) else (
- set /a t_head = %target:~0,3%, b_head = %base:~0,2%
- )
- ) else (goto :out_of_guess)
- for /l %%a in (0,1,9) do (
- set /a t = %%a * b_head
- if !t! gtr %t_head% (
- set /a max = %%a
- goto :out_of_guess
- )
- )
- :out_of_guess
- :: 做大致的除法预估 mid 值
- :estimate
- if %target_len% gtr 5 (
- if %target_len% geq %tbase_len% (
- set /a est=!target:~0,6!/!base:~0,5!
- rem echo est - !est!
- set /a mid=!est:~0,1!
- rem echo,&echo %base% !target! !est! !mid! !target:~0,5!/!base:~0,5!
- )
- )
- :: 如果预估max等于1,说明结果只能为0,跳过 bin_search
- if %max% equ 1 (set /a mid=0& goto :out_bin_search )
- rem echo, &echo %base%%mid% %target% %tbase_len% %target_len% max: %max%
- set ta=%time%
- :dec_bin_search
- set /a bstimes+=1
- :: mp = [base*10+mid] * mid
- if "%base%" == "0" (
- set /a tbase = mid
- ) else (
- set tbase=!base!!mid!
- )
- call :bignum_mp_single %tbase% %mid% %tbase_len% 1 mp mp_len
- set mp_%mid%=%mp%
- set mplen_%mid%=%mp_len%
- :: 比较 - 判断是否超出
- :cmp_begin
- if %mp_len% gtr %target_len% (set /a cmp=1&goto :cmp_end)
- if %mp_len% lss %target_len% (set /a cmp=-1&goto :cmp_end)
- :: 如果长度相同,直接按字符串对比
- if "%mp%" gtr "%target%" (set /a cmp=1&goto :cmp_end)
- if "%mp%" lss "%target%" (set /a cmp=-1&goto :cmp_end)
- if "%mp%" equ "%target%" (set /a cmp=0&goto :cmp_end)
- :cmp_end
- rem call :time_delta %ta% %time% bs_tu
- if %cmp% equ 0 (set /a quit=1, equ=1)
- if %cmp% equ 1 (set /a max=mid)
- if %cmp% equ -1 (set /a min=mid)
- if %range% leq 1 ( set /a quit=1 )
- set /a mid=(max+min)/2, range=max-mid
- if %quit% == 0 goto :dec_bin_search
- :out_bin_search
- rem echo, &echo est: %est%, act mid: %mid%
- set /p inp="%mid%"<nul
- if "%tnum%" == "" (
- :: 如果target只剩下 00,方案结束
- if "%target%" == "00" ( goto :dec_loop_out )
- if %cmp% == 0 (
- goto :dec_loop_out
- ) else (
- :: 当前精度
- if %prec% equ 0 set /p inp="."<nul
- set /a prec+=1
- )
- )
- rem echo b=%base% tb=%tbase% tg=%target% mp=%mp% mid=%mid%
- set ta=%time%
- call :bignum_minus %target% !mp_%mid%! %target_len% !mplen_%mid%! target target_len
- if %skip% geq %len% (
- set target=%target%00
- ) else (
- if "%target%" == "0" (
- set target=!tnum:~0,2!
- ) else (
- set target=!target!!tnum:~0,2!
- )
- set tnum=!tnum:~2!
- set /a skip+=2
- )
- set /a target_len+=2
- rem base=base*10+mid*2
- if "%base%" == "0" (
- set /a base=mid*2
- if !base! geq 10 (set /a base_len=2) else (set /a base_len=1)
- ) else (
- set /a db_mid=mid*2
- if !db_mid! geq 10 (set /a dbmidlen=2) else (set /a dbmidlen=1)
- call :bignum_plus !base!0 !db_mid! !base_len!+1 !dbmidlen! base base_len
- )
- if %prec% leq %precision% (goto :dec_loop)
- :dec_loop_out
- echo,
- echo search times: %bstimes%
- endlocal
- goto :eof
- :: 大数 乘以 单位数
- :bignum_mp_single
- setlocal
- set num_a=%1
- set num_b=%2
- set /a pool = 0, maxid = %3
- set "res="
- for /l %%a in ( 1, 1, %maxid% ) do (
- set /a mp = !num_a:~-%%a,1! * num_b + pool, t = mp %% 10, pool = mp / 10
- set res=!t!!res!
- )
- if %pool% neq 0 (
- set /a maxid+=1
- set res=!pool!!res!
- )
- endlocal&set %5=%res%&set %6=%maxid%
- goto :eof
- ::大数加法
- :bignum_plus
- setlocal
- set num_a=%1
- set num_b=%2
- set /a len_a=%3, len_b=%4
- set /a max = len_a
- if %len_b% gtr %len_a% (set /a max=len_b, len_b=len_a&set num_a=%num_b%&set num_b=%num_a%)
- set /a pool=0
- set res=
- for /l %%n in ( 1, 1, %max% ) do (
- if %%n leq %len_b% (
- set /a t = !num_a:~-%%n,1! + !num_b:~-%%n,1! + pool
- ) else (
- set /a t = !num_a:~-%%n,1! + pool
- )
- set /a mod = t %% 10, pool = t / 10
- set res=!mod!!res!
- )
- if %pool% gtr 0 (set /a max+=1 &set res=1%res%)
- endlocal &set %5=%res%&set %6=%max%
- goto :eof
- ::大数减法
- :bignum_minus
- setlocal
- set num_a=%1
- set num_b=%2
- set /a len_a=%3, len_b=%4
- set /a max = len_a
- if %len_b% gtr %len_a% (set /a max=len_b, len_b=len_a&set num_a=%num_b%&set num_b=%num_a%)
- set /a minus = 0
- set "res="
- for /l %%n in ( 1, 1, %max% ) do (
- if %%n leq %len_b% (
- set /a dt = !num_a:~-%%n,1! - !num_b:~-%%n,1! - minus
- ) else (
- set /a dt = !num_a:~-%%n,1! - minus
- )
- if !dt! lss 0 (
- set /a t = dt + 10, minus=1
- ) else (
- set /a t = dt, minus=0
- )
- set res=!t!!res!
- if !t! equ 0 (set /a zero+=1) else (set /a zero=0)
- )
- set res=!res:~%zero%!
- endlocal &set %5=%res%&set /a %6=%max%-%zero%
- goto :eof
- ::字符串长度计算
- :length %str% %vname%
- setlocal
- set test=%~1_%sharp%
- set test=!test:~0,%maxlen%!
- set test=%test:*_=%
- set /a len=maxlen-(%test:#=1+%1)
- endlocal &set %2=%len%
- goto :eof
- :: plp626的时间差函数 时间跨度在1分钟内可调用之;用于测试一般bat运行时间
- :time_delta <beginTimeVar> <endTimeVar> <retVar> // code by plp626
- setlocal
- set ta=%1&set tb=%2
- set /a "c=1!tb:~-5,2!!tb:~-2!-1!ta:~-5,2!!ta:~-2!,c+=-6000*(c>>31)"
- if defined %3 set /a c+=!%3!
- endlocal&set %3=%c%
- goto:eof
复制代码
- :: Bignum(integer) Square Root, Decimal Solution
- :: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Decimal_(base_10)
- :: 523066680/vicyang
- :: 2019-01
- @echo off
- setlocal enabledelayedexpansion
- :init
- rem 创建用于计算字符串长度的模板,长度限制为 2^pow
- set "sharp=#"
- set "serial=9876543210"
- set /a pow=11, maxlen=1^<^<pow
- for /l %%a in (1,1,%pow%) do set sharp=!sharp!!sharp!
- set precision=80
- rem call :check_one 2
- call :check_all
- pause
- exit /b
- :: 独立测试
- :check_one
- set ta=!time!
- rem call :check_first %1 !precision!
- call :decimal_solution %1
- call :time_delta !ta! !time! tu
- echo time used: !tu!
- goto :eof
- :: 批量测试
- :check_all
- for /l %%a in (1,1,99) do (
- echo test number: %%a
- rem call :check_first %%a !precision!
- call :decimal_solution %%a
- echo,
- )
- goto :eof
- :: 使用其他工具校验/对比结果
- :check_first
- perl -Mbignum=p,-%2 -le "print sqrt(%1)" 2>nul
- goto :eof
- :: 手算开根方案
- :decimal_solution
- setlocal
- set num=%1
- set tnum=%1
- :: 计算长度,判断需要截取的目标长度(1 or 2)
- call :length %num% len
- set /a mod=len %% 2, skip = 2 - mod
- set target=!tnum:~0,%skip%!
- set tnum=!tnum:~%skip%!
- set "base="
- :: prec 当前精度
- set /a prec = 0, base_len=0, target_len=skip
- :dec_loop
- :: 推算下一个数
- :estimate
- :: 如果目标值 小于 基数,下一个数字判定为0
- call :cmp %target% %base%0 %target_len% %base_len%+1 cmp
- if !cmp! equ -1 (
- set /a mid=0, mp=0, mplen=0
- goto :out_estimate
- )
- if %base_len% gtr 5 (
- set /a est=!target:~0,6!/!base:~0,5!
- ) else (
- :: 在set/a计算范围内的,[粗暴]遍历
- for /l %%a in (0,1,10) do (
- set /a mp=%base%%%a*%%a
- if !mp! gtr !target! (set /a est=%%a-1 &goto :out_est_for)
- )
- )
- :out_est_for
- :: 199999996400/1999999988 = 99.9999988
- :: but 199999/19999 = 10
- if %est% geq 10 (
- set /a tbase_len=base_len+1
- if !target_len! gtr !tbase_len! (set /a est=9)
- )
- set /a mid=!est:~0,1!
- call :bignum_mp_single !base!!mid! !mid! !base_len!+1 1 mp mplen
- call :cmp !mp! !target! !mplen! !target_len! cmp
- :: 如果mp超出目标范围
- if !cmp! equ 1 (
- set /a mid-=1
- call :bignum_mp_single !base!!mid! !mid! !base_len!+1 1 mp mplen
- )
- :out_estimate
- set /p inp="%mid%"<nul
- rem echo,&echo tg !target!, mp !mp!, base !base!, mid !mid!, est !est!
- if "%tnum%" == "" (
- :: 如果target只剩下 00,方案结束
- if "%target%" == "00" ( goto :dec_loop_out )
- if %cmp% == 0 ( goto :dec_loop_out )
- )
- :: 计算下一段target的值
- call :bignum_minus %target% %mp% %target_len% %mplen% target target_len
- :: 扩充target,如果被开根数已经截取完,直接补0,精度+1
- if %skip% geq %len% (
- set target=%target%00
- set /a prec+=1
- if !prec! equ 1 set /p inp="."<nul
- ) else (
- if "%target%" == "0" (set target=!tnum:~0,2!
- ) else (set target=!target!!tnum:~0,2!)
- set tnum=!tnum:~2!
- set /a skip+=2
- )
- set /a target_len+=2
- :: 更新基数 - base
- rem base=base*10+mid*2
- if "%base%" == "0" (
- set /a base=mid*2, base_len=1+base/10
- ) else (
- set /a db_mid=mid*2, dbmidlen=1+db_mid/10
- call :bignum_plus !base!0 !db_mid! !base_len!+1 !dbmidlen! base base_len
- )
- if %prec% leq %precision% (goto :dec_loop)
- :dec_loop_out
- echo,
- endlocal
- goto :eof
- :: 比较
- :cmp
- set /a La=%3, Lb=%4
- if %La% gtr %Lb% (set /a %5=1&goto :eof)
- if %La% lss %Lb% (set /a %5=-1&goto :eof)
- :: 如果长度相同,直接按字符串对比
- if "%1" gtr "%2" (set /a %5=1&goto :eof)
- if "%1" lss "%2" (set /a %5=-1&goto :eof)
- if "%1" equ "%2" (set /a %5=0&goto :eof)
- :: 大数 乘以 单位数
- :bignum_mp_single
- setlocal
- set num_a=%1
- set num_b=%2
- set /a pool = 0, maxid = %3
- set "res="
- for /l %%a in ( 1, 1, %maxid% ) do (
- set /a mp = !num_a:~-%%a,1! * num_b + pool, t = mp %% 10, pool = mp / 10
- set res=!t!!res!
- )
- if %pool% neq 0 (
- set /a maxid+=1
- set res=!pool!!res!
- )
- endlocal&set %5=%res%&set %6=%maxid%
- goto :eof
- ::大数加法
- :bignum_plus
- setlocal
- set num_a=%1
- set num_b=%2
- set /a len_a=%3, len_b=%4
- set /a max = len_a
- if %len_b% gtr %len_a% (set /a max=len_b, len_b=len_a&set num_a=%num_b%&set num_b=%num_a%)
- set /a pool=0
- set res=
- for /l %%n in ( 1, 1, %max% ) do (
- if %%n leq %len_b% (
- set /a t = !num_a:~-%%n,1! + !num_b:~-%%n,1! + pool
- ) else (
- set /a t = !num_a:~-%%n,1! + pool
- )
- set /a mod = t %% 10, pool = t / 10
- set res=!mod!!res!
- )
- if %pool% gtr 0 (set /a max+=1 &set res=1%res%)
- endlocal &set %5=%res%&set %6=%max%
- goto :eof
- ::大数减法
- :bignum_minus
- setlocal
- set num_a=%1
- set num_b=%2
- set /a len_a=%3, len_b=%4
- set /a max = len_a
- if %len_b% gtr %len_a% (set /a max=len_b, len_b=len_a&set num_a=%num_b%&set num_b=%num_a%)
- set /a minus = 0
- set "res="
- for /l %%n in ( 1, 1, %max% ) do (
- if %%n leq %len_b% (
- set /a dt = !num_a:~-%%n,1! - !num_b:~-%%n,1! - minus
- ) else (
- set /a dt = !num_a:~-%%n,1! - minus
- )
- if !dt! lss 0 (
- set /a t = dt + 10, minus=1
- ) else (
- set /a t = dt, minus=0
- )
- set res=!t!!res!
- if !t! equ 0 (set /a zero+=1) else (set /a zero=0)
- )
- set res=!res:~%zero%!
- endlocal &set %5=%res%&set /a %6=%max%-%zero%
- goto :eof
- ::字符串长度计算
- :length %str% %vname%
- setlocal
- set test=%~1_%sharp%
- set test=!test:~0,%maxlen%!
- set test=%test:*_=%
- set /a len=maxlen-(%test:#=1+%1)
- endlocal &set %2=%len%
- goto :eof
- :: plp626的时间差函数 时间跨度在1分钟内可调用之;用于测试一般bat运行时间
- :time_delta <beginTimeVar> <endTimeVar> <retVar> // code by plp626
- setlocal
- set ta=%1&set tb=%2
- set /a "c=1!tb:~-5,2!!tb:~-2!-1!ta:~-5,2!!ta:~-2!,c+=-6000*(c>>31)"
- if defined %3 set /a c+=!%3!
- endlocal&set %3=%c%
- goto:eof
复制代码
- >perl -e "grep {printf qq('%d' - %d\n), $_, ord($_) } (0..9)"
- '0' - 48
- '1' - 49
- '2' - 50
- '3' - 51
- '4' - 52
- '5' - 53
- '6' - 54
- '7' - 55
- '8' - 56
- '9' - 57
输出复制代码
- use Modern::Perl;
- # 生成 50 个随机字符,范围是数字和小写字母
- my @arr = map { ('0'..'9', 'a'..'z')[rand(36)] } (1 .. 50 );
- my $s = "bathomenet";
- say join(",", @arr);
- say join(",", split //, $s);
- print length($s);
这些在 python ruby perl 里面都是常规操作,字符串长度允许范围几乎就是对应内存的剩余空间。复制代码
- j,x,c,z,7,k,u,p,d,w,u,k,d,0,s,9,l,a,7,n,i,9,h,s,l,5,1,q,d,m,j,i,p,m,3,x,4,h,s,d,r,s,3,q,w,i,d,z,f,y
- b,a,t,h,o,m,e,n,e,t
- 10
复制代码
- for /l %%a in (1,1, 100%或者其他数字%) do ( call :开根函数 )
- exit/b
- :开根函数
- setlocal
- endlocal& goto :eof
Actual length of r: 1083710复制代码
- #include <iostream>
- #include <sstream>
- #include <iomanip>
- #include <chrono>
- #include "gmpxx.h"
- #include "gmp.h"
- using namespace std;
- int main(int argc, char *argv[] )
- {
- ostringstream os;
- mpf_class n(2, 10), r(1, 3600000);
- auto start = chrono::system_clock::now();
- r = sqrt(n);
- os << setprecision(10000000) << r;
- auto end = chrono::system_clock::now();
- chrono::duration<double> diff = end-start;
- cout << "Actual length of r: " << os.str().length() << endl;
- cout << "Time Used: " << setprecision(3) << diff.count() << " s" << endl;
- return 0;
- }
复制代码
- @set /p a=输入a=
- @set /a b=a
- @for /l %%a in (1,1,30) do @set /a b=(b+a/b)/2
- @set b
g++编译测试结果:复制代码
- #include <iostream>
- #include <vector>
- #include <chrono>
- using namespace std;
- using namespace std::chrono;
- const int SIZE = 800000;
- void vec_test(void);
- void c_array_test(void);
- void c_pointer_test(void);
- void time_used(system_clock::time_point& time_a);
- vector<int> vec(SIZE);
- int array1[SIZE];
- int array2[SIZE];
- int main(int argc, char *argv[])
- {
- system_clock::time_point start = system_clock::now();
- for (int i = 0; i < 1000; i++) vec_test();
- time_used(start);
- for (int i = 0; i < 1000; i++) c_array_test();
- time_used(start);
- for (int i = 0; i < 1000; i++) c_pointer_test();
- time_used(start);
- return 0;
- }
- void vec_test(void) {
- register int it;
- for (it = 0; it < SIZE; it++) vec[it] = it;
- }
- void c_array_test(void) {
- register int it;
- for (it = 0; it < SIZE; it++) array1[it] = it;
- }
- void c_pointer_test(void) {
- register int it;
- register int *pt = array2;
- for (it = 0; it < SIZE; it++) *(pt + it) = it;
- }
- void time_used(system_clock::time_point& time_a) {
- duration<double> diff;
- diff = chrono::system_clock::now() - time_a;
- cout << "Time used: " << diff.count() << endl;
- time_a = chrono::system_clock::now();
- }
欢迎光临 批处理之家 (http://www.bathome.net/) | Powered by Discuz! 7.2 |