Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
C++风格代码“冗余”,“低效” #include <string> #include <vector> #include <iostream> #include <sstream> #include <stdlib.h> using namespace std; string raw_haab_months( "pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu, uayet"); string raw_tzolkin_days( " imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau"); vector<string> *generate_set_from_string(string &str) { size_t pos; while ((pos = str.find(' ')) != string::npos) { str.erase(pos, 1); } vector<string> *ret = new vector<string>; ret->reserve(20); while ((pos = str.find(',')) != string::npos) { ret->push_back(str.substr(0, pos)); str.erase(0, pos + 1); } ret->push_back(str); return ret; } void assert(bool condition) { if (!condition)throw exception(); } class calender { virtual vector<string> *names() = 0; friend int convert_from_str(string _str, calender &c) { for (int i = 0; i < c.names()->size(); i++) { if (_str == c.names()->at(i)) { return i; } } throw exception(); } public: virtual int to_universal_day() = 0; virtual void from_universal_day(int uni_day) = 0; virtual string to_string() = 0; static const int undecided; }; const int calender::undecided = -1; class haab : public calender { private: static vector<string> *vec; virtual vector<string> *names() { return vec; } public: int day, month, year; haab() { day = 0; month = 0; year = 0; } haab(int uni_day) { from_universal_day(uni_day); } haab(int _day, const string &_month, int _year) { day = _day; month = convert_from_str(_month, *this); year = _year; } virtual int to_universal_day() { int ret = 365 * year + 20 * month + (day + 1); return ret; } virtual void from_universal_day(int uni_day) { year = uni_day / 365; if (year > 0 && uni_day % 365 == 0) { year -= 1; } month = (uni_day - 365 * year) / 20; day = uni_day - 365 * year - 20 * month; } virtual string to_string() { stringstream sstr; sstr << day << ". " << names()->at(month) << " " << year << endl; return sstr.str(); } }; vector<string> *haab::vec = generate_set_from_string(raw_haab_months); class tzolkin : public calender { private: static vector<string> *vec; virtual vector<string> *names() { return vec; } public: int index, name, year; tzolkin() { index = 1; name = 0; year = 0; } tzolkin(int uni_day) { from_universal_day(uni_day); } tzolkin(int _index, const string &_name, int _year) { index = _index; name = convert_from_str(_name, *this); year = _year; } virtual int to_universal_day() { return calender::undecided; } virtual void from_universal_day(int uni_day) { year = uni_day / 260; if (year > 0 && uni_day % 260 == 0) { year -= 1; } name = (uni_day - 1) % 20; index = ((uni_day - 1) % 13) + 1; } virtual string to_string() { stringstream sstr; sstr << index << " " << names()->at(name) << " " << year << endl; return sstr.str(); } }; vector<string> *tzolkin::vec = generate_set_from_string(raw_tzolkin_days); void convert(calender &from, calender &to) { int uni_day = from.to_universal_day(); to.from_universal_day(uni_day); } int main() { int count; cin >> count; vector<calender *> data; data.reserve(count); string raw, month; int day, year; for (int i = 0; i < count; i++) { raw.clear(); month.clear(); cin >> raw >> month >> year; day = atoi(raw.substr(0, raw.length() - 1).c_str()); haab *htemp = new haab(day, month, year); data.push_back(static_cast<calender *>(htemp)); } cout << data.size() << endl; for (int i = 0; i < count; i++) { tzolkin temp; convert(*(data[i]), temp); cout << temp.to_string(); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator