目录
一、题目内容
设计一个二次方程计算器
二、输入描述
每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。
三、输出描述
每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出"No Solution"。
四、输入输出示例
输入:
x^2+x=3x+4
输出:
-1.24 3.24
五、完整C语言代码
cpp
AC代码~
#include<stdio.h>
#include<string.h>
#include<math.h>
int a, b, c;
void subStr(char* s, char* subs, int a, int b) { // 子串分割函数(将等号左右分成两个表达式)
int i = 0;
for (int j = a; j <= b; j++) {
subs[i] = s[j];
i++;
}
subs[b + 1] = '\0';
}
void process(char* s, int mode) { // 处理子串函数
int i = 0;
int num = 0;
int flag = 1;
if (mode == 0) { // 左边等式
if (s[0] == 'x') {
if (s[i + 1] != '\0' && s[i + 1] == '^')
a = 1;
else
b = 1;
}
while (s[i] != '\0') {
while ('0' <= s[i] && s[i] <= '9') {
num = num * 10 + (s[i] - '0');
i++;
}
if (s[i] == 'x') {
if ((s[i + 1] != '\0' && s[i + 1] != '^') || (s[i + 1] == '\0')) {
if (flag == 1)
b += num;
else
b -= num;
num = 0;
i++;
} else { // 二次方
if (flag == 1)
a += num;
else
a -= num;
num = 0;
i = i + 3; // 跳过^和次方
}
} else if (s[i] == '+') {
if (s[i + 1] == 'x')
b++;
i++;
flag = 1;
num = 0;
} else if (s[i] == '-') {
if (s[i + 1] == 'x')
b--;
i++;
flag = 0;
num = 0;
}
}
if (flag == 1)
c += num;
else
c -= num;
} else { // 右边等式
if (s[0] == 'x') {
if (s[i + 1] != '\0' && s[i + 1] == '^')
a = 1;
else
b = 1;
}
while (s[i] != '\0') {
while ('0' <= s[i] && s[i] <= '9') {
num = num * 10 + (s[i] - '0');
i++;
}
if (s[i] == 'x') {
if ((s[i + 1] != '\0' && s[i + 1] != '^') || (s[i + 1] == '\0')) {
if (flag == 1)
b -= num;
else
b += num;
num = 0;
i++;
} else { // 二次方
if (flag == 1)
a -= num;
else
a += num;
num = 0;
i = i + 3; // 跳过^和次方
}
} else if (s[i] == '+') {
if (s[i + 1] == 'x')
b--;
i++;
flag = 1;
num = 0;
} else if (s[i] == '-') {
if (s[i + 1] == 'x')
b++;
i++;
flag = 0;
num = 0;
}
}
if (flag == 1)
c -= num;
else
c += num;
}
}
int main() {
char s[200], s1[100], s2[100];
while (gets(s)) {
int i = 0;
int len = strlen(s);
while (s[i] != '=')
i++;
subStr(s, s1, 0, i - 1);
subStr(s, s2, i + 1, len - 1);
a = b = c = 0;
process(s1, 0);
process(s2, 1);
double der = b * b - 4 * a * c;
if (der < 0)
printf("No Solution\n");
else {
double x1 = (-b + sqrt(der)) / (2 * a);
double x2 = (-b - sqrt(der)) / (2 * a);
if (x1 < x2) {
double tmp = x1;
x1 = x2;
x2 = tmp;
}
printf("%.2f %.2f\n", x2, x1);
}
}
return 0;
}