题记(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;
}
相关推荐
W说编程1 小时前
算法导论第十四章 B树与B+树:海量数据的守护者
c语言·数据结构·b树·算法·性能优化
Jay Kay1 小时前
深入解析协程:高并发编程的轻量级解决方案
开发语言·c++·算法
岁忧1 小时前
(LeetCode 每日一题) 2966. 划分数组并满足最大差限制 (贪心、排序)
java·c++·算法·leetcode·职场和发展·go
lifallen1 小时前
Java BitSet类解析:高效位向量实现
java·开发语言·后端·算法
学不好python的小猫2 小时前
7-4 身份证号处理
开发语言·python·算法
好易学数据结构3 小时前
可视化图解算法52:数据流中的中位数
数据结构·算法·leetcode
AI妈妈手把手4 小时前
K-means++:让K-means“聪明”地选择初始中心点
算法·机器学习·kmeans·聚类算法·技术分享·python实现·k-means++
二闹4 小时前
机器眼中的“连连看🎭️”CV算法入门指北
人工智能·opencv·算法
吃着火锅x唱着歌4 小时前
LeetCode 632.最小区间
算法·leetcode·职场和发展
车队老哥记录生活4 小时前
【MPC】模型预测控制笔记 (4):约束输出反馈MPC
笔记·算法