解方程(二分搜索)

博客内容介绍了如何运用二分搜索算法来解方程,强调了在保证精度的情况下,循环次数要远大于log2(1000000),并指出不能简单地用递增0.0001的方法,而应该采用二分法来确保解的准确性。文中包含了解决问题的代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

对于方程 2018 * x ^ 4 + 21 * x + 5 * x ^ 3 + 5 * x ^ 2 + 14 = Y,
告诉你Y的值,你能找出方程在0~100之间的解吗?

输入描述:

第一行输入一个正整数T(表示样例个数)
接下来T组样例
每组样例一行,输入一个实数Y

输出描述:

一行输出一个样例对应的结果,
输出方程在0~100之间的解,保留小数点后4位小数;如果不存在,输出 -1

这里要用一个循环完成二分搜索

为了保证精确度,循环次数远大于log2(1000000).

这里的解实际上不是整的0.0001(单位)

例如20180421,输出的是9.9993,实际是9.9993431009

所以不可以用1百万层循环来每次加0.0001(错误方法)

必须用二分法

代码:

#include<cstdio>
int main()
{
 int n,x;
 scanf("%d",&n);
 while(n--){
  double r=100,l=0,m,y;
  scanf("%lf",&y);
  for(int i=0;i<30;i++)///用循环来代替递归,循环次数要远大于log2(1000000);
  {
   m=(r+l)/2;
   if(2018*m*m*m*m+21*m+5*m*m*m+5*m*m+14<y)
    l=m;
   else r=m;
  }
  if(l==0||r==100)
    printf("-1\n");
  else printf("%.4f\n",m);
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值