迪迦


私信TA

用户名:dotcpp0776032

访问量:1268

签 名:

等  级
排  名 6733
经  验 1395
参赛次数 0
文章发表 25
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:
牛顿迭代法公式:X[n+1]=(X[n]+a/X[n])/2 ,由此可知牛顿迭代法需要知道两个临近的X值,一个是 X[n] ,另一个则是它的后一项 X[n+1] ,根据题目要求,当两个X值之差的绝对值,也即 |X[n+1]-X[n]|<=0.00001 时,即可认为此时的结果就是这个要求的数的平方根,由于事先并不知道X[n+1]和X[n]的值,而牛顿迭代法求解平方根也只需要关注前后两个X值之差的绝对值是否在误差范围内,对于X的值是多少并不重要,因此不妨假设初值X1=1,或者X1=a/2(a是要求平方根的数),总而言之,X的值可以是不为负数的任意值(负数没有平方根),然后根据初值X1,可以求出相邻下一项的值即X2,然会带入表达式 X[n+1] = (X[n]+a/X[n])/2中,继续重复之前的操作,直到X1与X2之差的绝对值小于0.00001,此时X[n+1]的值就是这个数的平方根。

注意事项:
1、牛顿迭代法公式:X[n+1] = (X[n] + a/X[n])/2
2、负数是没有平方根的,所以初值和需要求解的值不能为负数

3、只有当|X[n+1]-X[n]|<=0.00001时,才会结束迭代,也就是退出循环


参考代码:

#include "stdio.h"
#include "math.h"
int main()
{
    double X1, X2, a;
    while (scanf("%lf", &a) && a >= 0) // 输入不能为负数
    {
        X1 = a / 2; // 随机猜测一个非负数作为初值,不妨猜测X1为a/2
        X2 = (X1 + a / X1) / 2;
        while (fabs(X1 - X2) >= 1e-5) // 判断结束条件,当前后两个x值之差小于1e-5时结束循环
        {
            X1 = X2;                // 把当前X2的值赋值给X1,也就是把X[n+1]的值赋值给X[n]
            X2 = (X1 + a / X1) / 2; // 重新根据牛顿迭代法求出新的X2的值,也就是X[n+1]的值
        }
        printf("%0.3lf\n", X2); // 此时的X2的值近似等于a的平方根
        break;                  // 去掉break就可以实现循环求解输入的a的平方根
    }
    return 0;
}


 

0.0分

2 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »