题记(40)--二次方程计算器

目录

一、题目内容

二、输入描述

三、输出描述

四、输入输出示例

五、完整C语言代码


一、题目内容

设计一个二次方程计算器

二、输入描述

每个案例是关于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;
}
相关推荐
蓝斯4979 分钟前
Diff算法的简单介绍
算法
过期的秋刀鱼!13 分钟前
L2正则化,防止过拟合-历史补充
算法·过拟合·l2正则化
hansang_IR1 小时前
【题解】LC:Z 算法(Z Algorithm)
c++·算法·字符串
范什么特西1 小时前
回答知识总结02
算法·哈希算法
橘子汽水1681 小时前
Leetcode 230,98:二叉搜索树中第K小的元素,验证二叉搜索树
算法·leetcode·职场和发展
m沐沐1 小时前
【机器学习】DBSCAN聚类算法——原理、参数调优与实战
人工智能·python·深度学习·算法·机器学习·聚类·dbscan
问商十三载2 小时前
GEO优化的6个核心诊断工具,2026年实操版详解
人工智能·算法·机器学习
手写码匠2 小时前
华为云征文|DeepSeek-R1 智能问数 Agent 实战:Flexus X 实例 + Dify 构建企业级 Text-to-SQL 查询助手
人工智能·深度学习·算法·aigc
mifengxing2 小时前
Java集合与泛型
java·算法·复习笔记
liulilittle3 小时前
[OPENPPP2] ssea 算法详解(中文)
算法·x86·x64·simd·openppp2·ssea·base94