题目
题目背景
tz大佬从遥远的喜马拉雅山挖出了一个NNN阶的函数,为了研究这个神奇的函数,tzdalao把函数拉到了编程俱乐部。
题目描述
这棵函数是NNN次函数,经过观察发现,在闭区间[l,r][l,r][l,r]内函数存在一个极大值点,请求出这个极大值点xxx。
输入格式
第一行,一个正整数N和两个实数lll、rrr,表示闭区间范围。
第二行,N+1N+1N+1个实数,从左到右依次表示函数的系数。
输出格式
输出x的值,四舍五入保留5位小数。
输入输出样例
输入
3 -0.9981 0.5
1 -3 -3 1
输出
-0.41421
说明/提示
上述样例是n = 3,x3- 3x2-3x + 1
解题思路: 二分法;
已知在给定的区间内只有一个极大值点n, 根据费马引理可知, 有且仅有一个f '(n) = 0;
就是查找一个导函数等于零的点;
#include <stdio.h>
# include <math.h>
int main (void){
int n , i, h/*用来输出数组a中的值*/;
double left , right, k/*导函数的值*/,j/*循环中使用*/,a[1000]/* 存储导函数的值*/, mid;
scanf ("%d", &n);
scanf ("%lf%lf",&left, &right);
for ( i = 0; i < n+1;++i)
{
scanf ("%lf",&a[i]);//经常忘记加&,导致程序经常崩溃
}
while(right- left >= 0.0000001)//double 类型的精度有问题;
{
k = 0;//初始化
h = 0;//初始化
mid = left + ( right - left)/2;
for ( j = n; j > 0; j--)
{
k = j* a[h] * pow(mid,j-1) + k;//导函数关系式
h++;
}
if (k > 0)
{
left = mid;
}
else if (k < 0)
{
right = mid;
}
else
{
break;
}
}
printf ("%.5lf", mid);//double 类型自动四舍五入;
return 0;
}