POJ 1537 - Identifying Legal Pascal Real Constants
http://poj.org/problem?id=1537
概要
Pascal の実数定数として正しいかどうかを答える。
- 通常の数字に加え、小数点、あるいは scale factor (e または E)、あるいはその両方をもつ
- 小数点を持つ場合、その両側にそれぞれ少なくとも1つは数字がある
- 実数定数あるいは指数の前に符号 (+ または -) があってもよい
- 指数は整数
- 実数定数の前後に空白があってもよいが、実数定数の途中にはない
- 実数定数の値の範囲に制限はない
解法
やるだけ。 sscanf とか std::istringstream で楽できないかと思ったけど、一から実装したほうが楽だった…
poj/1537.cc1 #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 }