Monday, September 19, 2016

UVa 533 - Equation Solver

Accepted date: 2016-09-19
Run Time: 0.000
Ranking (as of 2016-09-19): 11 out of 389
Language: C++

/*
  UVa 533 - Equation Solver

  To build using Visual Studio 2012:
    cl -EHsc -O2 UVa_533_Equation_Solver.cpp
*/

#include <cstdio>
#include <cctype>
#ifndef ONLINE_JUDGE
#include <cassert>
#endif

struct linear_expression {
  int v_, c_;

  linear_expression() : v_(0), c_(0) {}
};

const int nr_chars_max = 100;
const char *ps;

int get_number()
{
  if (isdigit(*ps)) {
    int n = *ps++ - '0';
    while (isdigit(*ps)) {
      n = n * 10 + *ps++ - '0';
    }
    return n;
  }
  else
    return -1;
}

void expression(linear_expression& le);
void term(linear_expression& le);
void factor(linear_expression& le);

void expression(linear_expression& le)
{
  term(le);
  while (*ps == '+' || *ps == '-') {
    char c = *ps++;
    linear_expression le_;
    term(le_);
    if (c == '+')
      le.v_ += le_.v_, le.c_ += le_.c_;
    else
      le.v_ -= le_.v_, le.c_ -= le_.c_;
  }
}

void term(linear_expression& le)
{
  factor(le);
  while (*ps == '*') {
    ps++;
    linear_expression le_;
    factor(le_);
    le.v_ = le.c_ * le_.v_ + le.v_ * le_.c_;
    le.c_ *= le_.c_;
  }
}

void factor(linear_expression& le)
{
  int n = get_number();
  if (n != -1)
    le.c_ = n;
  else if (*ps == 'x')
    ps++, le.v_ = 1;
  else {
#ifndef ONLINE_JUDGE
    assert(*ps == '(');
#endif
    ps++;
    expression(le);
#ifndef ONLINE_JUDGE
    assert(*ps == ')');
#endif
    ps++;
  }
}

int main()
{
  char s[nr_chars_max + 1];
  for (int eq = 1; gets(s); eq++) {
    if (eq > 1)
      putchar('\n');
    ps = s;
    linear_expression lle, rle;
    expression(lle);
#ifdef DEBUG
    printf("%d*x + %d\n",  lle.v_, lle.c_);
#endif
#ifndef ONLINE_JUDGE
    assert(*ps == '=');
#endif
    ps++;
    expression(rle);
#ifdef DEBUG
    printf("%d*x + %d\n",  rle.v_, rle.c_);
#endif
    printf("Equation #%d\n", eq);
    int v = lle.v_, c = lle.c_;
    v -= rle.v_, c -= rle.c_;
    if (v)
      printf("x = %.6lf\n", static_cast<double>(-c) / v);
    else if (c)
      puts("No solution.");
    else
      puts("Infinitely many solutions.");
  
  }
  return 0;
}

No comments:

Post a Comment