[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 批处理高效率大数阶乘运算

因朋友叫写个效率能提高点的大数阶乘
发在这里 能有提高效率的 盼指教
如版主认为 重复贴 可删除
  1. @echo off&setlocal enabledelayedexpansion
  2. Set /a "X=1,X_len=6"
  3. set i=000000000000&set X=!i:~,5!!X!
  4. for /l %%i in (2 1 1000) do (
  5.     for /l %%j in (6 6 !X_len!) do (
  6.         if "!x:~-%%j,6!" neq "000000" (
  7.            for /f "tokens=* delims=0" %%k in ("!x:~-%%j,6!") do (
  8.        set /a "i=%%i*%%k+1!i:~-6!+0X3B8B87C0"
  9.            )
  10.         )
  11.        set T=!i:~-6!!T!&set "i=000000!i:~1,-6!"
  12.     )
  13.        for /f "tokens=* delims=0" %%j in ("!i!!t!") do set "x=00000%%j"
  14.        if "!i:0=!" neq "" set /a "X_len+=6"
  15.        set t=&set "i=%i%"
  16. )
  17. echo !X:~5!
  18. pause
复制代码

这样 大数乘法似乎效率可以高点了
论坛上 乘法的运算应该有了
如版主认为 重复贴 可删除
  1. @echo off&setlocal enabledelayedexpansion
  2. set X=33478071698956898786044169848212690817704794983713768568912431388982883793878002287614711652531743087737814467999489
  3. set Y=36746043666799590428244633799627952632279158164343087642676032283815739666511279233373417143396810270092798736308917
  4. for %%i in (X Y) do (
  5. set $%%i=000!%%i!&set S=!$%%i!&set #%%i=1
  6.     for %%j in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1)do if "!S:~%%j!" neq "" set/a #%%i+=%%j&set "S=!S:~%%j!"
  7. )
  8. set j=0000
  9. for /l %%i in (4 4 %#X%) do (
  10.     for /f "tokens=* delims=0" %%a in ("!$x:~-%%i,4!") do (
  11.         if "%%a" neq "" (
  12.            set s=&set i=0000
  13.            for /l %%j in (4 4 %#Y%) do (
  14.                for /f "tokens=* delims=0" %%b in ("!$y:~-%%j,4!") do (
  15.                    if "%%b" neq "" (
  16.                       set /a i=%%a*%%b+1!i:~-4!+1!j:~-%%j,4!+0x5F592E0
  17.                    ) else set/a i=1!i:~-4!+1!j:~-%%j,4!+0x5F592E0
  18.                )
  19.                      set s=!i:~-4!!s!&set i=!i:~,-4!
  20.            )
  21.                      set j=!i!!s!
  22.         )
  23.                      set str=!j:~-4!!str!
  24.                      set j=%j%!j:~1,-4!
  25.     )
  26. )
  27. for /f "tokens=* delims=0" %%i in ("!j!!str!") do echo %%i
  28. pause
复制代码

TOP

把大数除法  大数开方 以及加减 运算效率提上去
权当自娱自乐

TOP

http://www.bathome.net/viewthread.php?tid=17686&highlight=%BD%D7%B3%CB
数学研发网的一个网友,这是他学批处理的第一个程序,

TOP

为 学批处理的第一个程序 汗一个

TOP

本帖最后由 PowerShell 于 2013-7-5 19:16 编辑

1 这些代码我都看不懂
2 2楼和4楼能算多大的数捏?
3 我写过用powershell + .net4 算 9个9的阶乘的脚本习作,再大了就太慢了,毕竟是脚本语言。但是代码在家呢,今明天我会编辑此贴发上来共赏。
4 python也能算,在win中,算数学最恰当的应该是f#语言,各位菜鸟不可不知。其他的有matlab,pascal之类的。主要就是玩数学库。用cpu,显卡玩。用bat玩阶乘,我觉得算是原始时代,最差的。

--------------------------------------
搞错了,下面的是5个9的,我的机子跑5个9的话,半分钟左右。单cpu核心。汗啊。
不过如果9个9的话,你有大内存+快cpu,跑几个小时应该也能成。5个9那块要改成9个9,其他代码不用改任何。
-------------------------------------------------------------------------
Write-Host "注意:安装 .net4 先!"
Write-Host "注意:本程序已经测试过,成功运行,结果前n位为:28462596809170545189064132121198688901480"

[reflection.assembly]::loadwithpartialname("System.Numerics")
$anser_first="1"
$大数=[System.Numerics.BigInteger]:arse($anser_first)
$开始时间 = Get-Date
for ($i=99999;$i -gt 1;$i--)
{
$大数 *= $i

}
$结束时间 = Get-Date

$计算用时 = $结束时间 - $开始时间
Write-Host '计算用时为:',$计算用时,'请按回车键显示结果'
timeout /t 20
$大数.ToString()
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

本帖最后由 terse 于 2013-7-5 12:31 编辑

回复 6# PowerShell
首先bat 做此类肯定有局限的
不过在前面说了权当自娱自乐
BAT支持最大变量字节是8k
bat做此类真的是自娱自乐 玩玩算法而已 故本人后做的 大数开方 和 大数除法 也就不放上来了

另 一楼是 大数阶乘 二楼是大数乘法

TOP

数学 数值 计算是严谨的,能做多大的不敢说么?
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

尊敬的PowerShell版主大人   什么叫"能做多大的不敢说么"
清楚的说了 BAT支持最大变量字节是8k
也就是8192字节
你要是运算中无论是运算数还是运算结果 不超过这个限制 至少理论上可以 除非代码有问题
也就是说所有运算中用到的变量长度(包括结果)不超过这个限制就好 说得够明吗

TOP

本帖最后由 PowerShell 于 2013-7-5 19:35 编辑

说得够明吗----我觉得你说的不够明白。

n的阶乘应该用n!来表示,你的bat程序n最大能是多少?------n是一个数字,一个正整数。我问的你能听明白么?我要你回答一个确切的数字,即n,你告诉我8192字节干什么?
批处理高效率大数阶乘运算 - 大数是多大的数?n是多少?
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

回复 10# PowerShell
抱歉了 本人到真没测试你说 N 最大到多少
我想来这个论坛是学习的交流 感觉和你交流 寥寥几句  就火药味太浓 不觉得吗
至于你身为版主 我想一定在某方面 做的很好 但做什么都 人先要做好
就此。。。。。

TOP

正如你所说 计算是严谨 但我开始也说了 自娱自乐一下 是你来较真一下?
我也不做学术 你先做你的严谨  我先自娱自乐 不行吗
我之所以告诉你8192字节 BAT有了这个限制 你不理解 或其他的 我不得而知
难道要说大数 就非要说个数吗 至少这里的大数 是突破BAT 本身限制的

TOP

1 这些代码我都看不懂
2 2楼和4楼能算多大的数捏?
3 我写过用powershell + .net4 算 9个9的阶乘的脚本习作 ...
PowerShell 发表于 2013-7-5 10:35



我还以为传教士大人有什么精妙算法呢,原来是靠BigInteger类啊。

TOP

回复 12# terse


    terse兄何必跟这种不知天高地厚的年轻人一般见识,让他一个人凉快去吧。

TOP

14楼的孙子从哪冒出来的?
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

返回列表