标题: [数值计算] [分享]批处理大数的自由进制转换 [打印本页]
作者: qzwqzw 时间: 2012-6-3 18:02 标题: [分享]批处理大数的自由进制转换
本帖最后由 qzwqzw 于 2012-6-4 18:39 编辑
由于某一个加解密算法的需要
需要对一串数字进行特殊进制的转换
此前类似的进制转换算法应该已经不少
就是不知道是否可以支持大数(>2^31)
所以参考了网上的一些资料
设计了一个大数的自由进制转换算法
%进制数列%限制了自由进制的支持上限- @echo off & setlocal EnableDelayedExpansion
- set 大数=111111111111111111111111111111
- set from=2
- set to=10
- call :XConvert %大数% %from% %to% 结果
- echo [%from%进制] %大数%
- echo [%to%进制] %结果%
- pause
- goto :eof
-
- :XConvert - X进制大数N转换为指定Y进制(X/Y不大于62)
- :: 参考链接:http://www.cppblog.com/baby-fly/archive/2009/10/24/99362.html
- :: http://www.cnblogs.com/phinecos/archive/2009/09/11/1564975.html
- setlocal EnableDelayedExpansion
- set 源数=%~1
- set 源进制=%~2
- set 目标进制=%~3
- set 返回值=%~4
- set 进制数列=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
- :XCloop1
- set 位号=0
- set 模=0
- set 商=
- :XCloop2
- set 当前位=!源数:~%位号%,1!
- set 当前位值=-1
- :XCLoop3
- set /a 当前位值+=1
- if not "%当前位%"=="!进制数列:~%当前位值%,1!" goto :XCLoop3
- set /a 当前除数=模 * 源进制 + 当前位值
- set /a 当前商=当前除数 / 目标进制
- set 商=%商%!进制数列:~%当前商%,1!
- if "%商%"=="0" set 商=
- set /a 模=当前除数 %% 目标进制
- set /a 位号+=1
- if not "!源数:~%位号%,1!"=="" goto :XCloop2
- if "%商%"=="" set 商=0
- set 目标数=!进制数列:~%模%,1!%目标数%
- set 源数=%商%
- if not "%源数%"=="0" goto :XCloop1
- endlocal & set %返回值%=%目标数%
- goto :eof
复制代码
作者: gawk 时间: 2012-6-4 08:44
感谢分享
作者: terse 时间: 2012-6-4 14:00
曾写的 思路上貌似差不多
http://bbs.bathome.net/viewthrea ... mp;page=1#pid104741
作者: qzwqzw 时间: 2012-6-4 18:45
回复 3# terse
在大数相除的算法上
你我都是模拟人工算法
只是我的算法多了源进制的变换
但是你的for实现
比我的goto loop实现高效的多
这可以归功与理论结合实践吧
另外上次贴出的代码存在两个严重问题
看来大家都没发现悄悄改了
作者: neorobin 时间: 2012-6-4 22:24
本帖最后由 neorobin 于 2012-6-4 22:34 编辑
找到几篇 其它 算法(主要是转换算法, 未讨论大数)的文章, 未读明白, 所以不知是否有优越性.
矩阵算法:
http://home.ccil.org/~remlaps/AlternateBaseConversionAlgorithms.pdf
http://home.ccil.org/~remlaps/DescribeAlgorithm.pdf
另一篇
http://www.dickgrune.com/Program ... ion/no_div_conv.pdf
作者: terse 时间: 2012-6-9 02:28
回复 4# qzwqzw
修改下 提升点效率 没完全测试- @echo off&setlocal enabledelayedexpansion
- set S=111111111111111111111111111111
- set F=10
- set H=2
- set "str=0123456789abcdefghijklmnopqrstuvwxyz"
- echo [%f%进制] %S%
- FOR /L %%i in (0 1 35) do (
- set _!Str:~%%i,1!=%%i
- set #!Str:~%%i,1!=!Str:~%%i,1!
- )
- :lp
- set Ln=&set R=0&set "Sn=!s!"
- for %%i in (4096 2048 1024 512 256 128 64 32 16)do if "!Sn:~%%i!" NEQ "" set/aLn+=%%i&set Sn=!Sn:~%%i!
- set Sn=!Sn!FEDCBA9876543210&set/aLn+=0x!Sn:~16,1!
- for /l %%i in (0,1,%Ln%) do (
- for %%j in ("!S:~%%i,1!") do set num=!_%%~j!&if "!#%%~j!" neq %%j set /a num+=26
- set/a "N=num+(R*F),R=N%%H,N/=H"
- for %%j in (!N!) do set M=!M!!str:~%%j,1!
- )
- set B=!str:~%r%,1!!B!
- for /f "tokens=* delims=0" %%i in ("0!M!") do set "S=%%i"
- if defined S set M=&goto lp
- echo [%H%进制] !B!
- pause
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |