解题思路:
注意事项:
参考代码:
#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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复