私信TA

用户名:uq_26667239983

访问量:4474

签 名:

知识大海里的浪者

等  级
排  名 594
经  验 4244
参赛次数 0
文章发表 155
年  龄 18
在职情况 学生
学  校 湖南理工学院
专  业 软件工程

  自我简介:

解题思路:

注意事项:

参考代码:

#include<stdio.h>

#include<math.h>


// 先通过求一次导,可以知道该函数是单调递减,有且仅有一个值使等式等于0,

//不会存在两个值,以及没有的情况

//这时我们就需要在 irr 的范围中去找出这一个值。


//求和函数 

double qiuhe(int a[],int n,double irr)

 {

  double q=0;

  for(int i=0;i<=n;i++)

  {

  q+=a[i]/pow((1+irr),i);

}

return q;

 }


int main()

{

int n;

    while(scanf("%d",&n)&&n)//两个同时满足才为真,n==0时为假退出循环 

    {

int a[n+1];

for(int i=0;i<=n;i++)//注意这里时有等号的,目的是为了与 i 相对应 

{

scanf("%d",&a[i]);

}

double irr;

//由于 irr 的范围是(-1,正无穷),所以 x 要大于 -1

// y 的值可以设大一点  

    double x=-1+1e-5;

    double y=1e6;

    //使用二分查找,这道题时间为 2秒,还是有可能超时的 

    while(fabs(qiuhe(a,n,x)-qiuhe(a,n,y))>1e-6)

    //如果运行超时,那就是这个运行条件这里有问题

   //别问,问就哭给你看 

   //至于为什么不是大于0,这是因为 qiuhe函数返回的是double 类型

  //两个 double 类型相减,哪怕结果为0,可实际上的结果比0还要大那么一点点 !!! 

      {

      irr=(x+y)/2;

      //小于0 说明两者符号异号 

      if(qiuhe(a,n,irr)*qiuhe(a,n,x)<0)//(判断 a 到 irr 范围,成立说明零点在这其中) 

      y=irr; //(将 irr 缩小) 

      else if(qiuhe(a,n,irr)*qiuhe(a,n,y)<0)//(判断 irr 到 y 范围)

      x=irr;//(将 irr 扩大) 

      else if(qiuhe(a,n,irr)==0)//(找到了) 

      break;

}

printf("%.2lf\n",irr);

}

return 0;

}


 

0.0分

0 人评分

  评论区

  • «
  • »