题记(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;
}
相关推荐
草履虫建模2 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq4 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq4 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
爱吃rabbit的mq5 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
(❁´◡`❁)Jimmy(❁´◡`❁)6 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi6 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
不能隔夜的咖喱6 小时前
牛客网刷题(2)
java·开发语言·算法
VT.馒头6 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
进击的小头7 小时前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
咖丨喱8 小时前
IP校验和算法解析与实现
网络·tcp/ip·算法