返回列表 发帖
回复 5# sishentibu


  我发现1000052是个7位数,但是不兼容

TOP

回复 2# zhangenming
批处理也能完成这个任务,只是绕点,但是也完成了。兼容正负数,可以无限位数,也可以切割任意长度字符串。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set num=-14159265358979323846264338327950288314159265358979323846264338327950288
  4. :cut
  5. set p=!num:~-3!
  6. if "!num!"=="" (echo !p1:~0,-1! & pause & exit)
  7. set p1=!p!,!p1!
  8. set num=!num:~0,-3!
  9. goto cut
复制代码
最大可以切割5千多位的超级大数
运行实例
1

评分人数

TOP

回复 15# codegay

呵呵,就跟切菜一样。

TOP

回复 20# sishentibu
对,0,-3那句就是去掉最后三个。自然就空了。

TOP

本帖最后由 happy886rr 于 2016-3-11 20:20 编辑

回复 22# sishentibu
基本上就是按字符串分割的,所以会出现负号被分割的情况如-,300
还需要加一句!p1:-,=-!就更完美了。
这是改进后的
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p num=输入数字:
  4. :cut
  5. if "!num!"=="" (
  6. set p1=!p1:-,^=-!
  7. echo !p1:~1! &pause>nul&exit
  8. )
  9. set p1=,!num:~-3!!p1!
  10. set num=!num:~0,-3!
  11. goto cut
复制代码

TOP

本帖最后由 happy886rr 于 2016-3-11 22:03 编辑

回复 23# sishentibu
因为setlocal开启变量延迟,所以p1不用定义。直接拿来用。
set p1=!p1:-,^=-! 一行里出现两个等号,怕歧义,所以加个^让机器好理解

TOP

回复 25# sishentibu
有时候会有用比如你要过滤等号!str:=-=!就会歧义

TOP

回复 27# sishentibu
这好像就是个漏洞,不管转不转义,!str: ==!,里边只要遇到第一个等号就工作。微软就这么设计的。

TOP

回复 30# sishentibu
set a=%%i这个必须有。
我发现for和if比goto运行的速度快很多,所以我那个分割可以写成for的,速度简直快了几十倍,还有批处理居然按行读取硬盘的bat文件,因此我把for循环弄成一行,让机器一次读完一个for语句。我设置为1000次循环,即最大3000位数字截取,运行速度快的惊人。
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p num=输入数字:
  3. for /l %%i in (1 1 1000) do (if !num! equ 0 (set p1=!p1:-,=-!&set /p =!p1:~1!) else (set p1=,!num:~-3!!p1!&set num=!num:~0,-3!))
复制代码
另外我发现用for /l这个可以加快计算圆周率和开平方的速度.

TOP

回复 32# sishentibu
这个好办。用token findstr /n,截取bat文件。然后将行号和pause都echo到bat文件的每一行下,就是你写个批处理给你要测试的bat添加pause和行号,方便你查错。

TOP

回复 34# sishentibu
批处理遇到0开头的就当八进制处理了,遇到0x开头的就16进制计算了,计算时间差这块需要加个100就行了,然后截取。

TOP

回复 36# CrLf
是set/a 1!t2:~3,2!-1!t1:~3,2!,加前缀1?
另外我看到大师 2013年的 关于批处理计算圆周率的三个方案.我发现了一个收敛速度快1000倍的公式,这样就实现了计算圆周率的模块化。可以直接计算第n位,
pi=2*1+2*1!/3!!+2*2!/5!!+2*3!/7!!+...+2*k!/(2*k+1)!!+...这个公式的收敛速度只有2,而且分母不是2。需要分母是2的次幂的公式,这样除以2的次幂就相当于移位>>

TOP

回复 40# sishentibu
你写的(!t2:~3,2!-!t1:~3,2!)就是在截取分钟,万一是8点09分,你试试看批处理会不会疯掉。第二个问题另外做个批处理给要调试的批处理每行下添加pause和行号,方便你知道运行到第几行。

TOP

本帖最后由 happy886rr 于 2016-3-15 15:09 编辑

回复 38# CrLf
这个算法收敛很快,4次循环就可得到8位有效派值,遇到的问题主要是浮点运算,我的核心算法是
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set t=100000000
  4. set /a pi=t-t/2-t/5-t/6
  5. for /l %%i in (1 1 4) do (set /a pi=((4*t/(8*%%i+1^)-2*t/(8*%%i+4^)-t/(8*%%i+5^)-t/(8*%%i+6^)^)^>^>4*%%i^)+pi)
  6. echo 3.!pi!
  7. pause
复制代码
在往后边循环,由于浮点运算的关系,我需要用bat模拟浮点运算,或者用快速模幂乘。后边的设计比较复杂,包括余项的处理。
1

评分人数

    • CrLf: 鼓励钻研技术 + 1

TOP

回复 46# sishentibu
差不多就是逐行运行,停到哪有行号,再下一步闪退,就知道是第几行出错了。

TOP

返回列表