用牛顿迭代法求一个整数(只求整数)的平方根!

波波911 2014-03-08 12:54:09
请高手指点一下!重写一个sqrt()--求一个32位的整数的平方根的算法,开根号后是一个16位的int 型~!!请高手帮个忙哈!分数会给大家的!
也就是说,该平台不支持浮点数运算!只支持整数运算!
...全文
292 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxqcn 2014-03-12
  • 打赏
  • 举报
回复
关于这个问题,数学研发论坛曾做了深入探讨: [讨论] 二进制32位整数快速平方根 里面有纯 ALU 指令,及 FPU 甚至 SSE2 等指令的算法,及测试数据。 楼主的问题,建议你可用我在 96# 里的算法。
Agnostos 2014-03-10
  • 打赏
  • 举报
回复
引用 4 楼 truelance 的回复:
[quote=引用 3 楼 u013489254 的回复:] 漏了一行 。。。


def isqrt(n):
    if n < 1:
        return 0
    x = y = n
    while True:
        x = y
        y = (x + n / x) / 2
        if x - y < 1:
            break
    return x
结束条件是x-y<=1 举例: n=3时, 你的程序会在1和2之间无穷循环 [/quote] 我运行过了 没有无限循环 x = 2 y = 1: x - y == 1 x = 1 y = 2: x - y == -1 退出
熊熊大叔 2014-03-10
  • 打赏
  • 举报
回复
引用 3 楼 u013489254 的回复:
漏了一行 。。。


def isqrt(n):
    if n < 1:
        return 0
    x = y = n
    while True:
        x = y
        y = (x + n / x) / 2
        if x - y < 1:
            break
    return x
结束条件是x-y<=1 举例: n=3时, 你的程序会在1和2之间无穷循环
Agnostos 2014-03-10
  • 打赏
  • 举报
回复
漏了一行 。。。


def isqrt(n):
    if n < 1:
        return 0
    x = y = n
    while True:
        x = y
        y = (x + n / x) / 2
        if x - y < 1:
            break
    return x
panghuhu250 2014-03-09
  • 打赏
  • 举报
回复
y = (n/y+y)/2迭代就可以,其中的除法都是整数除法,即5/4=1. 可以证明sqrt(n*n)一定会收敛到n.
Agnostos 2014-03-09
  • 打赏
  • 举报
回复

def abs(x):
    if x < 0:
        return -x
    return x
    
def isqrt(n):
    if n < 1:
        return 0
    x = y = n
    while True:
        x = y
        if x - y < 1:
            break
    return x
    
for i in range(1,65):
    print isqrt(i)

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧