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

给出个求极大值的捷径:
通过二进制移位来给2开方,一直开到溢出,溢出后其结果是负的,以此负值判断结束条件。
  1. @echo off &setlocal enabledelayedexpansion
  2. for /l %%i in  (1,1,256) do (
  3.     set /a "_tmp=1<<%%i"
  4.     if !_tmp! leq 0 (
  5.         set /a "t2=%%i-1"
  6.         set  /a "max=((1<<!t2!)-1)+(1<<!t2!)"
  7.         goto 2out
  8.     )
  9. )
  10. :2out
  11. echo 2的!t2!次方最接近极大值!max!
  12. pause>nul
复制代码
我用for是和256是因为我还没有看到支持256bit数据类型的编程语言和操作系统……
当然你喜欢用goto也没什么问题的……

TOP

本帖最后由 applba 于 2011-4-27 13:24 编辑

既然上面求了极大值,现在就不存在溢出问题了:
  1. @echo off &setlocal enabledelayedexpansion
  2. :input
  3. cls
  4. set /p _n=请输入正整数:
  5. set /a  n=!_n!&&if  !n! lss 2 goto input
  6. set  /a "varup=1,vardn=2147483647"
  7. for /l %%i in (1,1,30) do (
  8.         set /a "varup=!varup!*!n!,vardn=!vardn!/!n!"
  9.         set /a "var=!vardn!/!varup!"
  10.         if !var! lss !n! (
  11.                 if !var! equ 0 (set /a "cnt=2*%%i-1" && goto out)
  12.                 set /a "cnt=2*%%i" && goto out
  13.         )
  14. )
  15. :out
  16. echo !n!的!cnt!次方接近最大值!
  17. PAUSE&goto input
复制代码
思路也很简单,正反一起用,往中间碰撞……

TOP

34# qzwqzw


汗,我把这个极值翻转居然给忘了………………

就是不知道这个通用性如何?

TOP

本帖最后由 applba 于 2011-4-27 13:33 编辑

35# qzwqzw


请教  第八行和第九行合并(用逗号)表达式后,结果会异常,但是程序运行都正常的……

超级大数?在cmd.exe是输不进去的,你赋值的时候提示无效……

关于负数很好弄吧,只看正值就行了, for i=(0,2,30)就行了?

TOP

返回列表