火龙信奥
  • 首页
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

CSP2022初赛第18题 - 牛顿迭代法

作者: 作者的头像   huolong , 时间:2026-08-07 13:08:43 , 所有人可见, 阅读  14

这段代码展示了两种计算平方根的方法:solve1 使用二分查找计算整数平方根 $\lfloor \sqrt{n} \rfloor$;solve2 使用牛顿迭代法(Newton's Method)在给定初始值的情况下迭代 $k$ 次,以逼近精确的浮点数平方根。


1. 代码逻辑详细分析

  • solve1() (整数平方根):
    • 在区间 $[0, n]$ 内进行二分查找。
    • 目标是找到最大的整数 $mid$ 使得 $mid^2 \le n$。
    • 时间复杂度:$O(\log n)$。
  • solve2(double x) (牛顿迭代):
    • 初始值 $x$ 由 solve1() 提供(即 $\lfloor \sqrt{n} \rfloor$)。
    • 迭代公式:$x_{next} = \frac{1}{2} (x + \frac{n}{x})$。
    • 这是牛顿法求 $f(x) = x^2 - n = 0$ 的根,具有平方收敛速度。
    • 时间复杂度:$O(k)$。
  • main():
    • 输入 $n$ 和 $k$。
    • 输出经过 $k$ 次迭代后的近似值,以及一个布尔值(判断 ans * ans 是否完全等于 n)。

2. 题目解析

判断题

  1. 该算法最准确的时间复杂度分析结果为 $O(\log n + k)$。

    • 答案:A (正确)
    • 分析:solve1 是 $O(\log n)$,solve2 的循环执行 $k$ 次。两者是顺序执行关系,总复杂度相加。
  2. 当输入为 9801 1 时,输出的第一个数为 99。

    • 答案:A (正确)
    • 分析:$99^2 = 9801$。solve1(9801) 返回 99。solve2(99, 1) 计算 (99 + 9801/99) / 2 = 99。结果保持不变。
  3. 对于任意输入的 $n$,随着所输入 $k$ 的增大,输出的第二个数会变成 1。

    • 答案:B (错误)
    • 分析:只有当 $n$ 是完全平方数时,结果才可能为 1。如果 $n$ 不是完全平方数(如 $n=2$),$\sqrt{n}$ 是无理数,double 类型(有限精度)的平方永远无法精确等于整数 $n$,因此 ans * ans == n 始终为 0(false)。
  4. 该程序有存在缺陷。当输入的 $n$ 过大时,第 12 行的乘法有可能溢出,因此应当将 mid 强制转换为 64 位整数再计算。

    • 答案:B (错误)
    • 分析:题目给定 $n \le 47000$。solve1 中 mid 的初值约为 $n/2 = 23500$。$23500^2 = 552,250,000$,远小于 32 位有符号整数的最大值(约 $2.14 \times 10^9$)。即使 mid 接近 46340 才会溢出,而在此程序中 mid 会迅速向 $\sqrt{n} \approx 216$ 缩小,因此在给定约束下不会溢出。

单选题

  1. 当输入为 2 1 时,输出的第一个数最接近( )。

    • 答案:C (1.5)
    • 分析:
      • solve1(2) 返回 $\lfloor \sqrt{2} \rfloor = 1$。
      • solve2(1, 1) 执行一次循环:$x = (1 + 2/1) / 2 = 1.5$。
  2. 当输入为 3 10 时,输出的第一个数最接近( )。

    • 答案:B (1.732)
    • 分析:$n=3$,$k=10$。牛顿迭代法收敛极快,迭代 10 次后已经极其接近 $\sqrt{3} \approx 1.73205$。
  3. 当输入为 256 11 时,输出的第一个数( )。

    • 答案:A (等于 16)
    • 分析:
      • solve1(256) 返回 $16$(因为 $16^2 = 256$)。
      • solve2(16, 11):由于初始值 16 已经是精确根,代入公式 $x = (16 + 256/16)/2 = 16$,无论迭代多少次,结果始终保持 $16.0$。

3. 总结

  • 知识点:二分查找、牛顿迭代法、浮点数精度、整数溢出边界。
  • 关键理解:牛顿迭代法在初始值选在根附近时收敛极快;浮点数相等判断(==)在涉及无理数运算时通常不可靠。

—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com

关于火龙

  • 关于我们
  • 预约试听
  • ACM课程
  • CSP课程
  • 学习指南

帮助中心

  • 用户协议
  • 打字练习
  • 在线画图
  • DevC++下载
  • CSP报名
  • GESP官网

推荐课程

  • C++零基础入门(可试看)
  • C++进阶提升
  • GESP考级辅导
  • GESP打卡
  • CSP-J/S打卡

公众号

火龙信奥公众号二维码

抖音号

火龙信奥抖音号二维码

地址:义乌市北门街188号新天地商厦二楼2F 邮箱:wdlok305@126.com

© 2017-2026 义乌市睿码科技有限公司版权所有 浙ICP备2021013995号

火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码