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

回复 1楼 的帖子

  1. @echo off&setlocal enabledelayedexpansion
  2. (set/p=初始化中, 请稍等...<nul)&(call :initRoots)
  3. echo.&echo cmd 下最大正整数 2147483647 (2^^31-1) 的各次方根整数部分(次数2--30):
  4. (for /l %%a in (2,1,30) do set /p=!root%%a!,<nul) & (echo  )
  5. :loop
  6. set/p i=请输入正整数:
  7. if %i% lss 1 goto loop
  8. if %i% equ 1 echo 1的任意次方=1&goto loop
  9. set /a exp=1
  10. for /l %%a in (2,1,30) do if %i% leq !root%%a! set /a exp+=1
  11. echo %i%的%exp%次方接近于cmd最大值.
  12. goto loop
  13. :initRoots 初始化 cmd 下最大正整数 2147483647 (2^31-1) 的各次方根(次数2--30)
  14. for /l %%a in (2,1,30) do (call :searchRoot root%%a 2 50000 %%a)& set /p=^>^><nul
  15. exit /b
  16. :checkOverflow overflow x y rem 检测 x^y 是否溢出
  17. (set tc=%2)&(set te=%3)
  18. :next
  19. if !te! gtr 1 set /a "t0=tc,tc*=%2,t1=tc/ %2,te-=1"
  20. if !t0! neq !t1! (set %1=yes)&(exit /b)
  21. if !t0! geq !tc! (set %1=yes)&(exit /b)
  22. if !tc! leq 0 (set %1=yes)&(exit /b) else if !te! leq 1 (set %1=no)&(exit /b) else goto next
  23. exit /b
  24. :searchRoot root lower upper time
  25. set /a "ll=%2,uu=%3"
  26. :schNext
  27. set /a t=(ll+uu)/2
  28. if !t! equ !ll! set /a "%1=t" & exit /b
  29. call :checkOverflow ofl !t! %4
  30. if /i "!ofl!"=="yes" (set /a "uu=t") else (set /a "ll=t")
  31. goto schNext
  32. exit /b
复制代码

[ 本帖最后由 neorobin 于 2009-12-19 03:42 编辑 ]
1

评分人数

TOP

回复 5楼 的帖子

4 楼代码除了次数 30, 其它并未直接或间接实质性利用 最大正整数 值, 该数仅是 echo 的内容 未起计算作用.
下面代码彻底不利用已知的 最大正整数 值, 反算我就不做了, 呵呵, 至于复杂, 嗯是有些.
  1. @echo off&setlocal enabledelayedexpansion
  2. set t=1
  3. :searchMaxInt
  4. set /a "t<<=1"
  5. if !t! leq 0 ((set /a "t>>=1,maxInt=t-1+t")& echo cmd 下最大正整数为:!maxInt!) else goto searchMaxInt
  6. (set/p=初始化中, 请稍等...<nul)&(call :initRoots)
  7. echo.&echo cmd 下最大正整数 !maxInt! 的各次方根整数部分(整数部分≥2)(次数2--!expMax!):
  8. (for /l %%a in (2,1,!expMax!) do set /p=!root%%a!,<nul) & (echo  )
  9. :loop
  10. set/p i=请输入正整数:
  11. if %i% lss 1 goto loop
  12. if %i% equ 1 echo 1的任意次方=1&goto loop
  13. set /a exp=1
  14. for /l %%a in (2,1,!expMax!) do if %i% leq !root%%a! set /a exp+=1
  15. echo %i%的%exp%次方接近于cmd最大值.
  16. goto loop
  17. :initRoots 初始化 cmd 下最大正整数 !maxInt! 的各次方根(次数2--!expMax!)
  18. for /l %%a in (2,1,256) do (call :searchRoot root%%a 1 !maxInt!/2 %%a)&(if !root%%a! lss 2 set /a expMax=%%a-1& exit /b)& set /p=^>^><nul
  19. exit /b
  20. :checkOverflow overflow x y rem 检测 x^y 是否溢出
  21. (set tc=%2)&(set te=%3)
  22. :next
  23. if !te! gtr 1 set /a "t0=tc,tc*=%2,t1=tc/ %2,te-=1"
  24. if !t0! neq !t1! (set %1=yes)&(exit /b)
  25. if !t0! geq !tc! (set %1=yes)&(exit /b)
  26. if !tc! leq 0 (set %1=yes)&(exit /b) else if !te! leq 1 (set %1=no)&(exit /b) else goto next
  27. exit /b
  28. :searchRoot root lower upper time 二分法搜索方根
  29. set /a "ll=%2,uu=%3"
  30. :schNext
  31. set /a t=(ll+uu)/2
  32. if !t! equ !ll! set /a "%1=t" & exit /b
  33. call :checkOverflow ofl !t! %4
  34. if /i "!ofl!"=="yes" (set /a "uu=t") else (set /a "ll=t")
  35. goto schNext
  36. exit /b
复制代码

[ 本帖最后由 neorobin 于 2009-12-19 23:51 编辑 ]

TOP

回复 1楼 的帖子

请问楼主检测 溢出 有哪些好的方法

TOP

返回列表