FJNU OJ 1054 노란 계산기 II

14151 단어
1054: 노란 계산기 II Time Limit: 1 Sec Memory Limit: 128MB 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 + 2 x = 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
"
); else { int totalx = left_num_x - right_num_x; int totalnum = right_num - left_num; if (totalx == 0) { printf("no solution
"
); continue; } double ans = totalnum*1.0 / totalx*1.0; printf("%.2lf
"
, ans); } } } } /************************************************************** Problem: 1054 User: raphl Language: C++ Result: Accepted Time:4 ms Memory:1272 kb ****************************************************************/

좋은 웹페이지 즐겨찾기