解题思路:
注意事项:
参考代码:
#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语言代码)浏览:3569 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:610 |
C语言训练-计算1~N之间所有奇数之和 (C语言代码)浏览:689 |
简单的a+b (C++语言代码)浏览:895 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:781 |
C语言训练-尼科彻斯定理 (C语言代码)浏览:509 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:895 |
母牛的故事 (C语言代码)浏览:1451 |
C语言考试练习题_保留字母 (C语言代码)浏览:743 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:645 |