acm 杭电 train problem ii 1023
2009-12-27 13:09
435 查看
今天第一次写博客
本来以为long double应该可以搞定了,但是结果有好几十位,只好自己写大数加法,为了尽量少修改原来的代码,我修改的stl里string的接口,从而直接当成大整数来用。
本来以为long double应该可以搞定了,但是结果有好几十位,只好自己写大数加法,为了尽量少修改原来的代码,我修改的stl里string的接口,从而直接当成大整数来用。
#include <iostream> #include <algorithm> #include <string> #include <stdlib.h> using namespace std; class big_int : protected string { //实际数字123456在内存中以字符串"654321"存放 friend ostream &operator <<(ostream &os, const big_int &right); friend big_int operator +(const big_int &left, const big_int &right); friend bool operator ==(const big_int &left, int right); public: big_int &operator =(int right); big_int(int r) { operator =(r); } big_int(const string &r): string(r) {} big_int(): string("0") {} }; ostream &operator <<(ostream &os, const big_int &right) { int i = right.size(); while(i > 0) { --i; os << right[i]; } return os; } big_int operator +(const big_int &left, const big_int &right) { int iter_l = 0;//左操作数下标 int iter_r = 0;//右操作数下标 char mod = '0';//MOD 10 char carry = '0';//满10进位 string sum;//和 while(iter_l < left.size() && iter_r < right.size()) //当两个操作数都参与运算 { mod = (left[iter_l] - '0' + right[iter_r] - '0' + carry - '0') % 10 + '0'; carry = (left[iter_l] - '0' + right[iter_r] - '0' + carry - '0') / 10 + '0'; sum += mod; ++iter_l; ++iter_r; } const big_int &rest = left.size() > right.size() ? left : right;//应用位数长的那一个操作数 int iter_rest = iter_l;//位数更长的那个操作数的下标 while(iter_rest < rest.size()) //剩下一个操作数 { mod = (rest[iter_rest] - '0' + carry - '0') % 10 + '0'; carry = (rest[iter_rest] - '0' + carry - '0') / 10 + '0'; sum += mod; ++iter_rest; } if(carry != '0') { sum += carry; } return sum; } bool operator ==(const big_int &left, int right) { return dynamic_cast<const string&>(left) == static_cast<string>(big_int(right)); } big_int &big_int::operator =(int right) { char str[20]; itoa(right, str, 10); reverse(str, str + strlen(str)); string::operator =(str); return *this; } big_int mat[101][101]; big_int &t(int n, int m) //计算train排列数目的公式: //t(n, m) = m, (n == 1) //t(n, m) = t(n-1, m), (n == m) //t(n, m) = t(n-1, m) + t(n, m-1), (其他情况) { if(!(mat [m] == 0))//已经初始化的情形 return mat [m]; if(n == 1)/*以下都是未初始化的情形*/ return mat [m] = m; if(n == m) return mat [m] = t(n - 1, m); return mat [m] = t(n - 1, m) + t(n, m - 1); } int main() { int n; while(cin >> n) cout << t(n, n) << '/n'; return 0; }
相关文章推荐
- 杭电1023——Train Problem II
- 杭电 hdu 1023——Train Problem II .
- 杭电_ACM_Train Problem II
- 杭电1023 Train problemII(卡塔兰大数)
- 杭电ACM OJ 1023 Train Problem II 卡特兰数 + 大数乘法 轻松解决出栈情况计数
- hdu 1023 Train Problem II 高精训练
- 【ACM】杭电1022:Train Problem I
- HDU 1023 Train Problem II
- 【HDU-1023】 Train Problem II 【卡特兰数+高精度】
- HDU-1023 Train Problem II
- hdu 1023 ——Train Problem II(卡特兰数+高精度+java)
- HDU-1023 -Train Problem II(卡特兰数)
- HDU 1023 Train Problem II
- hdu 1023 Train Problem II(catalan 大数)uva 10303 uva 991
- HDU 1023 Train Problem II
- hdu 1023 Train Problem II(java+卡特兰数)
- hdu 1023 Train Problem II_出栈方法数_卡特兰数
- HDOJ 1023 Train Problem II
- 杭电ACM 1022 Train Problem I
- hdu 1023 Train Problem II