找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 31871|回复: 17

批处理计算根号(1-99)

[复制链接]
发表于 2017-7-8 12:07:02 | 显示全部楼层 |阅读模式
本帖最后由 a2002 于 2017-7-8 12:08 编辑

这是一个计算2次方根的程序(1到99以内的数),源码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p "a=数(1-99):"
  3. set /p "loop=保留的有效数字:"
  4. set s=0&set r=&set y=!a!
  5. :loop
  6. if "!loop!" equ "!_loop!" goto :ans
  7. set /a _loop+=1
  8. for /l %%a in (1,1,10) do (
  9.         set /a t1=s*20*%%a+%%a*%%a
  10.         if !t1! gtr !y! (
  11.                 set /a n=%%a-1,_s=s*20*n+n*n,y=y*100-_s*100
  12.                 set r=!r!!n!&set s=!r!
  13.                 if !y! equ 0 goto :ans
  14.                 goto :loop
  15.         )
  16. )
  17. :ans
  18. echo 结果:!r:~0,1!.!r:~1!
  19. pause>nul
复制代码
大于100、小于1的数原理相同,不再详述

评分

参与人数 3技术 +3 收起 理由
codegay + 1 1
happy886rr + 1 上个世纪的算法
老刘1号 + 1 技术

查看全部评分

 楼主| 发表于 2017-7-8 12:15:20 | 显示全部楼层
原理:
这是一个很少有人知道的笔算法
例子:计算根2
2=1*1+1                                  ;第一位,1,余数,1
余数*100:1*100=100             ;便于除
商4,(1*20+4)*4=96            ;商4
100-96=4                                 ;余数
4*100=400                              ;便于除
商1,(14*20+1)*1=281        ;商1
400-281=119                           ;余数
119*100=11900                      ;便于除
…………
 楼主| 发表于 2017-7-8 12:19:23 | 显示全部楼层
竖式:
 楼主| 发表于 2017-7-8 12:22:53 | 显示全部楼层
由于P计算最大为2^31-1,所以有时末尾不能显示,正常现象
发表于 2017-7-8 12:42:30 | 显示全部楼层
本帖最后由 523066680 于 2017-7-8 12:45 编辑

是牛顿迭代法?忘得差不多了

你肯定不知道卡马克,卡神。
 楼主| 发表于 2017-7-8 13:06:57 | 显示全部楼层
本帖最后由 a2002 于 2017-7-8 13:08 编辑
你肯定不知道卡马克,卡神。
523066680 发表于 2017-7-8 12:42



    这个确实不知道,毕竟没高中嘛,没必要懂那么多
发表于 2017-7-8 13:17:05 | 显示全部楼层
本帖最后由 523066680 于 2017-7-8 13:19 编辑

回复 6# a2002

    卡马克是个传奇,也不是说高中不高中。
他在自己开发的3D游戏的源码中,用了一个神奇的数字,快速求平方根。

http://blog.chinaunix.net/uid-9255716-id-107951.html

http://www.matrix67.com/blog/archives/362

传奇事迹:
http://baike.baidu.com/link?url= ... oAm0ZHJtsjPEjzSESGW

评分

参与人数 1技术 +1 收起 理由
老刘1号 + 1 感谢分享

查看全部评分

发表于 2017-7-8 15:54:55 | 显示全部楼层
回复 1# a2002
这个算法在1985年之前,几乎所有初中的学校都会教的,是笔算开平方的算法。我在小学时研究过,当时改进到了笔算开立方(开立方时: 3*结果的平方)。

而卡马克算法  只在快速估算有限精度的开方,因为当时还没有FPU浮点指令集,卡马克在写游戏时,尤其在3D图形编程时,经常遇到开方之类的,当时的C库效率也不是很高,于是他鬼使神差的整出了0x5f3759df这个值(后来证实换成0x5f375a86会更好)。
发表于 2017-7-8 17:06:24 | 显示全部楼层
If you really like game development, then you must know John Carmack.
 楼主| 发表于 2017-7-8 18:03:49 | 显示全部楼层
回复 8# happy886rr


    都是很厉害的了,小学就能研究^1/3,佩服
 楼主| 发表于 2017-7-8 18:08:02 | 显示全部楼层
回复 8# happy886rr


    ^1/3还要*30、+平方,才算到4位,余数就8位了,那方法特别难算
发表于 2017-7-8 21:27:17 | 显示全部楼层
回复 11# a2002
是啊,批处理溢出了。不过这个貌似用C语言才能实现最佳性能。脚本语言只能满足一般精度,但C语言可以做任意精度的高精度计算。
 楼主| 发表于 2017-7-8 22:44:29 | 显示全部楼层
回复 12# happy886rr


    不过return可以是小数吗?(我C语言渣de一B)
发表于 2017-7-8 23:16:56 | 显示全部楼层
本帖最后由 523066680 于 2017-7-8 23:22 编辑

回复 13# a2002

如果自定义函数声明类型是 float/double, 就可以是浮点数
返回值要求是整数的,只有 main 这样的函数。

不过这没有关系,不管是浮点数还是整数,在底层,一切都是数字。浮点数就是有个单元存储了小数点所在的位置。

推荐 《Linux C编程一站式学习》,非常适合查阅和练习。有在线版(地址忘了。
 楼主| 发表于 2017-7-9 07:52:57 | 显示全部楼层
回复 14# 523066680


    还有这个int main()类型可以改吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:03 , Processed in 0.023265 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表