FJNU OJ 1054黄黄的计算器II

该博客介绍了一个编程挑战,要求编写程序解决一元一次方程。题目描述了方程的输入格式,并提供了样例输入和输出。文章讨论了如何判断方程是否有解,并指出如果方程中变量被消去则视为无解。
摘要由CSDN通过智能技术生成

1054: 黄黄的计算器II
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 13 Solved: 2

Submit Status Discuss
Description
我们知道黄黄是个喜欢怀旧的人,他总喜欢换把小学数学题拿出做,这样他就可以彰显自己智商多么高(很显然他在欺骗自己),但是黄黄的智商不是很高,对于解小学一元一次方程有点头疼,所以他希望写一个程序来实现解一元一次方程.

Input
包含多组样例,第一行一个数字T表示测试样例的个数,接下来T行,每行一个字符串表示一个一元一次方程.

方程的描述规则:由一种变量,整数以及+,-,=符号组成,数字和符号之间一定有空格,整数和变量之间没有空格,符号和变量之间不一定有空格,等号两边有空格.(如果觉得无法理解方程描述请认真参考输入样例)

保证构成方程的字符个数不会超过30.

Output
如果有解,只要输出一个保留两位小数的浮点数表示方程的解.

如果没有解,输出“no solution”(没有带引号)

提示:例如 x = x、1 = 1、x - 1 = x - 1这样的式子是被判定成无解的,也就是说如果最后x被消掉方程就会无解!

Sample Input
3
x + 2x = 3
-x - 3 = 0
1 = 1
Sample Output
1.00
-3.00
no solution
HINT
Source
2015年低年级程序设计大赛热身赛

就是各种模拟各种烦 数据范围还改小了 不然还得用大数

#include "cstring"
#include "string"
#include "iostream"
#include "cstdio"
#include "cmath"
#include "stack"

#define MIN -1
#define PLUS 1

using namespace std;

int main()
{
    int  ncase;
    while (scanf("%d", &ncase) != EOF)
    {
        getchar();
        while (ncase--)
        {
            char a[1000];
            gets(a);
            int i = 0;
            int left_num = 0, left_num_x = 0;
            int right_num = 0, right_num_x = 0;
            int flag = 0;//前面没有数字
            stack <char> list;
            int symbol = PLUS;
//          int symbol_num_x = PLUS;
            int marklr = 0;

            for (int j = 0;; j++)
            {
                if (a[j] == '\0')
                    break;
                if (!((a[j] >= '0'&&a[j] <= '9') || a[j] == ' ' || a[j] == '+' || a[j] == '-' || a[j] == '='))
                {
                    a[j] = 'x';
                }
            }

            while (a[i] != '\0')
            {
                if (flag == 0&&a[i]=='x')
                {
                    if (marklr == 0)
                    {
                        if (symbol == PLUS)
                            left_num_x++;
                        else
                            left_num_x--;
                    }
                    else
                    {
                        if (symbol == PLUS)
                            right_num_x++;
                        else
                            right_num_x--;
                    }
                }
                if (flag == 1 && a[i] == 'x')
                {
                    int sum = 0;
                    int v = 1;
                    while (!list.empty())
                    {
                        sum += (list.top()-'0')*v;
                        list.pop();
                        v = v * 10;
                    }
                    if (marklr == 0)
                    {
                        if (symbol == PLUS)
                            left_num_x += sum;
                        else
                            left_num_x -= sum;
                    }
                    else
                    {
                        if (symbol == PLUS)
                            right_num_x += sum;
                        else
                            right_num_x -= sum;
                    }
                }



                if (a[i] >= '0'&&a[i] <= '9')
                {
                    flag = 1;
                    list.push(a[i]);
                }
                if (a[i] == '+')
                {
                    int sum = 0;
                    int v = 1;
                    while (!list.empty())
                    {
                        sum += (list.top()-'0')*v;
                        list.pop();
                        v = v * 10;
                    }
                    if (marklr == 0)
                    {
                        if (symbol == PLUS)
                            left_num += sum;
                        else
                            left_num -= sum;
                    }
                    else
                    {
                        if (symbol == PLUS)
                            right_num += sum;
                        else
                            right_num -= sum;
                    }
                    symbol = PLUS;
                    flag = 0;
                }


                if (a[i] == '-')
                {
                    int sum = 0;
                    int v = 1;
                    while (!list.empty())
                    {
                        sum += (list.top()-'0')*v;
                        list.pop();
                        v = v * 10;
                    }
                    if (marklr == 0)
                    {
                        if (symbol == PLUS)
                            left_num += sum;
                        else
                            left_num -= sum;
                    }
                    else
                    {
                        if (symbol == PLUS)
                            right_num += sum;
                        else
                            right_num -= sum;
                    }
                    symbol = MIN;
                    flag = 0;
                }
                if (a[i] == '=')
                {
                    int sum = 0;
                    int v = 1;
                    while (!list.empty())
                    {
                        sum += (list.top() - '0')*v;
                        list.pop();
                        v = v * 10;
                    }
                    if (marklr == 0)
                    {
                        if (symbol == PLUS)
                            left_num += sum;
                        else
                            left_num -= sum;
                    }
                    else
                    {
                        if (symbol == PLUS)
                            right_num += sum;
                        else
                            right_num -= sum;
                    }
                    marklr = 1;
                    symbol = PLUS;
                    flag = 0;
                }
                i++;


            }


            int sum = 0;
            int v = 1;
            while (!list.empty())
            {
                sum += (list.top() - '0')*v;
                list.pop();
                v = v * 10;
            }
            if (marklr == 0)
            {
                if (symbol == PLUS)
                    left_num += sum;
                else
                    left_num -= sum;
            }
            else
            {
                if (symbol == PLUS)
                    right_num += sum;
                else
                    right_num -= sum;
            }



            if (left_num == right_num&&left_num_x == right_num_x)
                printf("no solution\n");
            else
            {
                int totalx = left_num_x - right_num_x;
                int totalnum = right_num - left_num;
                if (totalx == 0)
                {
                    printf("no solution\n");
                    continue;
                }
                double ans = totalnum*1.0 / totalx*1.0;
                printf("%.2lf\n", ans);

            }

        }
    }

}
/**************************************************************
    Problem: 1054
    User: raphl
    Language: C++
    Result: Accepted
    Time:4 ms
    Memory:1272 kb
****************************************************************/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值