[ create a new paste ] login | about

Link: http://codepad.org/TXLNaz4c    [ raw code | output | fork ]

C++, pasted on Mar 31:
#include <iostream>
#include <string>
#include <cctype>

int gcd(int a, int b) {
  if (b == 0)
    return a;
  else return gcd(b, a % b);
}

int f0(int &m, char c, std::string::const_iterator &p, std::string::const_iterator e) {
  int n = 0;
  while (*p != c && p != e) {
    if (!isdigit(*p))
      throw 999;
    if (m == 1) m = 9; else m = m * 10 + 9;
    n = n * 10 + *(p++) - '0';
  }
  return n;
}

int f1(int &m, std::string::const_iterator &p, std::string::const_iterator e) {
  return f0(m, '.', p, e); }
int f2(int &m, std::string::const_iterator &p, std::string::const_iterator e) {
  return f0(m, '[', p, e); }
int f3(int &m, std::string::const_iterator &p, std::string::const_iterator e) {
  return f0(m, ']', p, e); }

class C {
  bool flagSyntaxError;
  int numerator, denominator;
public:
  C(std::string s) {
    int z = 0, nc = 0, pc = 0, dummy, mnc = 1, mpc = 1, g;
    std::string::const_iterator p = s.begin();
    std::string::const_iterator e = s.end();
    flagSyntaxError = false;
    try {
      z = f1(dummy, p, e);
      if (p != e) {
        p++;
        nc = f2(mnc, p, e);
        if (p != e) {
          p++;
          pc = f3(mpc, p, e);
        }
      }
    } catch (int e) { flagSyntaxError = true; }
    numerator = mpc * nc + pc + z * ((mnc == 1) ? mnc : mnc + 1) * mpc;
    denominator = ((mnc == 1) ? mnc : mnc + 1) * mpc;
    g = gcd(denominator, numerator);
    denominator /= g;
    numerator /= g;
  }

  friend std::ostream &operator<<(std::ostream &stream, C c) {
    if (c.flagSyntaxError)
      stream << "syntax error";
    else
      stream << c.numerator << "/" << c.denominator;
    return stream;
  }
};

int main() {
  std::string s;
  s = ".3";        std::cout << s << " : " << C(s) << " :" << 3.0/10 << std::endl;
  s = "123";       std::cout << s << " : " << C(s) << " :" << 123.0/1 << std::endl;
  s = ".[555]";    std::cout << s << " : " << C(s) << " :" << 5.0/9 << std::endl;
  s = ".3[33]";    std::cout << s << " : " << C(s) << " :" << 1.0/3 << std::endl;
  s = "456.789";   std::cout << s << " : " << C(s) << " :" << 456789.0/1000 << std::endl;
  s = "12.[345]";  std::cout << s << " : " << C(s) << " :" << 4111.0/333 << std::endl;
  s = "1.2[34]"; std::cout << s << ": " << C(s) << ":" << 611.0 / 495 << std::endl;
  std::cout << C("12[3") << std::endl;
  return 0;
}
/* end */


Output:
1
2
3
4
5
6
7
8
.3 : 3/10 :0.3
123 : 123/1 :123
.[555] : 5/9 :0.555556
.3[33] : 1/3 :0.333333
456.789 : 456789/1000 :456.789
12.[345] : 4111/333 :12.3453
1.2[34]: 611/495:1.23434
syntax error


Create a new paste based on this one


Comments: