九度[1103]-二次方程计算器
题目描述:
设计一个二次方程计算器
输入
每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。
输出
每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”。
样例输入
x^2+x=3x+4
样例输出
-1.24 3.24
解题思路:
判断各个位置字符的出现可能
AC代码:
#include <cstdio>
#include <string>
#include <iostream>
#include <cmath>
using namespace std;
int a, b, c;
string input;
void init(string input){
int t = 0;
bool flag = true;
//cout<<input<<endl;
//cout<<"len: "<<input.length()<<endl;
for(int i = 0; i < input.length(); i++){
//cout<<input[i]<<endl;
// 输入一共有4种可能,数字,+,-,x(^肯定跟在x后面)
if('0' <= input[i] && input[i] <= '9') {
t = t*10 + (input[i] - '0');
// 如果为最后一个数字,根据flag加减
if(i == input.length()-1){
if(flag) c += t;
else c -= t;
}
// 如果后面紧跟+-,则根据flag +- ,若跟着x,则等下一轮循环
else{
if(input[i+1] == '+' || input[i+1] == '-'){
if(flag) c += t;
else c -= t;
}
}
}
else{
// 如果输入为x
if(input[i] == 'x'){
//如果^跟在x后面,则更新a 否则更新t
if(input[i+1] == '^'){
// 如果t=0,则a++
if(t == 0) a += 1;
else{
if(flag) a += t;
else a -= t;
}
i += 2;
}
else{
// 如果t=0,则b++
if(t == 0) b += 1;
else{
if(flag) b += t;
else b -= t;
}
}
}
else if(input[i] == '+'){
flag = true;
}
else if(input[i] == '-'){
flag = false;
}
t = 0;
}
}
//cout<<a<<" "<<b<<" "<<c<<endl;
}
int main(){
//freopen("C:\\Users\\Administrator\\Desktop\\test.txt", "r", stdin);
while(getline(cin, input)){
string::size_type idx = input.find("=");
init(input.substr(0, idx));
a = -1*a, b = -1*b, c = -1*c;
init(input.substr(idx+1));
double f = b*b - 4*a*c;
if(a != 0){
if(f < 0) printf("No Solution\n");
else if(f == 0) printf("%.2lf\n", (-1.0*b/(2.0*a)));
else {
if(a > 0) printf("%.2lf %.2lf\n", (-1.0*b-sqrt(f))/(2.0*a), (-1.0*b+sqrt(f))/(2.0*a));
else printf("%.2lf %.2lf\n", (-1.0*b+sqrt(f))/(2.0*a), (-1.0*b-sqrt(f))/(2.0*a));
}
}
else printf("%.2lf\n", (-1.0*c/b));
a = b = c = 0;
}
//fclose(stdin);
return 0;
}