POJ 1537 - Identifying Legal Pascal Real Constants

http://poj.org/problem?id=1537

概要

Pascal の実数定数として正しいかどうかを答える。

解法

やるだけ。 sscanf とか std::istringstream で楽できないかと思ったけど、一から実装したほうが楽だった…

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 typedef string::const_iterator Iterator;
 7 
 8 bool sign(Iterator& it, const Iterator& last)
 9 {
10   if (it == last) {
11     return false;
12   } else if (*it == '+' || *it == '-') {
13     ++it;
14     return true;
15   } else {
16     return false;
17   }
18 }
19 
20 void digits(Iterator& it, const Iterator& last)
21 {
22   while (it != last && '0' <= *it && *it <= '9') {
23     ++it;
24   }
25 }
26 
27 bool ok(const string& s)
28 {
29   Iterator it = s.begin(), last = s.end();
30   sign(it, last);
31   Iterator save = it;
32   digits(it, last);
33   if (it == save) {
34     return false;
35   }
36   if (*it == '.') {
37     ++it;
38     save = it;
39     digits(it, last);
40     if (it == save) {
41       return false;
42     }
43   } else if (it == last) {
44     return false;
45   }
46 
47   if (it == last) {
48     return true;
49   } else if (*it == 'e' || *it == 'E') {
50     ++it;
51     sign(it, last);
52     save = it;
53     digits(it, last);
54     if (it == save) {
55       return false;
56     }
57     return it == last;
58   } else {
59     return false;
60   }
61 }
62 
63 int main()
64 {
65   for (string s; getline(cin, s) && s != "*";) {
66     s.erase(remove(s.begin(), s.end(), ' '), s.end());
67     cout << s << " is " << (ok(s) ? "" : "il") << "legal." << endl;
68   }
69   return 0;
70 }
poj/1537.cc