问题 : 大家好 我是水题
时间限制: 1 Sec 内存限制: 128 MB
题目描述
给出一个最简的一元三次方程式,求出该方程式的递增区间。方程式保证出现x^3,x前系数不会为0并且绝对值小于520。 无穷用oo表示 空集用ooo表示,直接输出ooo不用带括号。无需考虑中括号“[ ]”,使用“()”即可。
输入
每行一个最简式的一元三次方程式。
输出
该方程式的递增区间。如有多个用空格隔开,正常数字保留两位有效数字。
样例输入
y=x^3+x y=x^3+2x^2+3样例输出
(-oo,+oo) (-oo,-1.33) (0.00,+oo)
求一元三次函数的递增区间 y=ax^3+bx^2+cx+d;
只需求导,使之成为一元二次函数,只要是一元二次函数大于零就是一元三次函数的递增区间。所以实际上就是求一元二次方程的根。3a 2b c 这三者之间的关系。
利用求根公式x=-b(-+)sqrt(b*b-4ac)/(2a)求出相应的解,根据a的正负来解决
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
using namespace std;
#define LL long long
#define N 1006
int Q[N],falg;
char str[N];
void prime(char str[])
{
int len=strlen(str);
int d=1,e=0,f=0,w=0;
for(int i=0; i<len; i++)
{
if(str[i]>='0'&&str[i]<='9')
{
if(!w) e=e*10+str[i]-'0';
else f=f*10+str[i]-'0';
}
else if(str[i]=='x')
w=1;
else if(str[i]=='+'||str[i]=='-')
{
if(w&&!f) f=1;
if(e==0&&w) e=1;
Q[f]+=d*e;
e=f=w=0;
if(str[i]=='-') d=-1;
else d=1;
}
}
if(!e) e=1;
if(w&&!f) f=1;
Q[f]+=e*d;
}
int main()
{
while(scanf("%s",str)!=EOF)
{
falg=0;
memset(Q,0,sizeof(Q));
prime(str+2);///提取系数
int a=3*Q[3];
int b=2*Q[2];
int c=Q[1];
if(b*b-4*a*c<=0)
{
if(a>0) printf("(-oo,+oo)\n");
else printf("ooo\n");
continue;
}
double x1=(-b-sqrt(1.0*b*b-4.0*a*c))/2/a;
double x2=(-b+sqrt(1.0*b*b-4.0*a*c))/2/a;
if(x1>x2) swap(x1,x2);///设置存放位置
if(fabs(x1)<1e-8) x1=0.00;///避免出现-0.00的现象
if(fabs(x2)<1e-8) x2=0.00;
if(a>0) printf("(-oo,%.2f) (%.2f,+oo)\n",x1,x2);
else printf("(%.2f,%.2f)\n",x1,x2);
}
return 0;
}
/**************************************************************
Problem: 2168
User: 2017020004
Language: C++
Result: 正确
Time:0 ms
Memory:2040 kb
****************************************************************/