二分

模板

//将等式化简使右边=0
double cal(double l)
{
	return 等式左边
}
int main()
{
	while(cin>>x>>y>>c)
	{
		//确定二分的两端值
		double x1=__;
		double x2=__;
		//不断往答案缩小范围
		while(abs(x1-x2)>=1e-10)
		{
			double x=(x1+x2)/2.0;
			if(cal(x)>=0) x1=x;
			else x2=x;
		}
		//输出答案(直接就是x1)
		printf("%.3lf\n",x1);
	}
}


Solve It 

Solve the equation:
        p*e-x+ q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0

 where 0 <= x <= 1.

输入 p q  r s t u  输出 x

Sample Input
0 0 0 0 -2 1
1 0 0 0 -1 2
1 -1 1 -1 -1 1
Sample Output
0.7071
No solution

0.7554

#include<iostream>
#include <string.h>
#include <map>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <set>
using namespace std;
double p,q,r,s,t,u;
double cal(double x)
{
	return p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*x*x+u;
	//e的几次方用exp()来表示
}
int main()
{
	while(cin>>p>>q>>r>>s>>t>>u)
	{
		if(cal(0)<0||cal(1)>0)
		{
			cout<<"No solution"<<endl;
		}
		else
		{
			double x1=0;
			double x2=1;
			//二分不断往计算结果为0的凑
			while(abs(x1-x2)>=1e-10)
			{
				double x=(x1+x2)/2;
				if(cal(x)>0) x1=x;
				else x2=x;
			}
			printf("%.4lf\n",x1);
		}
	}
}

Crossed ladders

Sample Input
30 40 10
12.619429 8.163332 3
10 10 3
10 10 1
Sample Output
26.033
7.000
8.000
9.798



#include <iostream>
#include <string.h>
#include <map>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <set>
using namespace std;
double c,x,y;
double cal(double l)
{
	double t1=sqrt(y*y-l*l);
	double t2=sqrt(x*x-l*l);
	return t1*t2-c*(t1+t2);
	//根据三角形相似,推出来公式。
	//tan a= sin a/ sin b。(分l1 l2,最后根据l1+l2=l求得公式)
}
int main()
{
	while(cin>>x>>y>>c)
	{
		double mins=min(x,y);
		
			double x1=0;
			double x2=mins;
			while(abs(x1-x2)>=1e-10)
			{
				double x=(x1+x2)/2.0;
				if(cal(x)>=0) x1=x;
				else x2=x;
			}
			printf("%.3lf\n",x1);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值