-
设计一个二次方程计算器
链接
http://ac.jobdu.com/problem.php?pid=1103
题目描述:
-
输入:
-
每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。
-
输出:
-
每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”。
-
样例输入:
-
x^2+x=3x+4
-
样例输出:
-
-1.24 3.24
-
想法:这题主要是在考察字符串的处理,这类题目重点是考虑清楚以什么作为分隔符,一开始是打算以x为分割,但是有常数不带x,不好,所以用字符'+'\'-'来分割,这样只有等式两侧的第一个项可以没有'+'\'-',特殊处理一下就是了。
-
ac代码
-
#include <iostream> #include <queue> #include <stdio.h> #include <math.h> #define INF 1<<20 using namespace std; queue<int> a[3]; string x; int getType(int index); int type; int main() { while(getline(cin,x)) { int equa = INF; int flag = 1; for(int i=0; i<x.size(); i++) { if(x[i]=='=') { equa = i; flag = -1; } int flag2; if((i==0||i==equa+1)&&x[i]!='+'&&x[i]!='-') { flag2 = 1; int ret = getType(i); a[type].push(ret*flag2*flag); } else if(x[i]=='+') { flag2 = 1; int ret = getType(i+1); a[type].push(ret*flag2*flag); } else if(x[i]=='-') { flag2 = -1; int ret = getType(i+1); a[type].push(ret*flag2*flag); } } int sa[3]; for(int i=0;i<3;i++) sa[i]=0; for(int i=0; i<3; i++) { while(!a[i].empty()) { sa[i]+=a[i].front(); a[i].pop(); } } if(sa[1]*sa[1]-4*sa[0]*sa[2]<0) cout << "No Solution" << endl; else { double result1,result2; result1 = (0-sa[1]-sqrt(sa[1]*sa[1]-4*sa[0]*sa[2]))/(2*sa[2]); result2 = (0-sa[1]+sqrt(sa[1]*sa[1]-4*sa[0]*sa[2]))/(2*sa[2]); printf("%.2f %.2f\n",result1,result2); } } return 0; } int getType(int index) { int flag = 0; int ret = 0; while(x[index]!='='&&x[index]!='+'&&x[index]!='-'&&x[index]!='x'&&index<x.size()) { flag = 1; ret = ret*10 + x[index++]-'0'; } if(index<x.size()){ if(x[index]=='x'&&x[index+1]=='^') type = 2; else if(x[index]=='x'&&x[index+1]!='^') type = 1; else if(x[index]=='+'||x[index]=='-'||x[index]=='=') type = 0; } else type = 0; if(!flag) ret = 1; return ret; }