原题:http://acm.nyist.net/JudgeOnline/problem.php?pid=883 AC:2014-01-18 12:12:59
这题本是水题,但我觉得题目不严谨,如果输入“9 1 299”时,答案有50多位数,本应用高精度做的,所以我也按高精度的要求AC该题。这题使用到①大数相加模板,②大数除2模板,③int变为string的方法。
做题中还发现南阳理工的OJ不支持64位整型的__int64写法,iostream不支持printf函数,会导致CE。
#include <iostream> #include <vector> #include <string> #include <sstream> using namespace std; string MyAdd(string s1, string s2) { if (s2.size() > s1.size()) swap(s1, s2); string::iterator p1 = s1.end(), p2 = s2.end(); while (p2 != s2.begin()) { *p1 += *p2 - '0'; if (*p1 > '9') *p1 -= 10, *(p1-1) += 1; p1--, p2--; } *p1 += *p2 - '0'; while (*p1 > '9') { *p1 -= 10; if (p1 == s1.begin()) { s1 = '1' + s1; break; } p1--; *p1 += 1; } return s1; } string div2(string s) { // 将显示表示的s做除2运算 int r = 0, t; string ans(s); string::iterator p1 = ans.begin(), p2 = s.begin(); while( p2 != s.end() ) { t = *p2 - '0'; *p1 = (t + 10*r) / 2 + '0'; r = t % 2; p1++; p2++; } // 去掉前导0 while(*(ans.begin())=='0') ans.erase(ans.begin()); return ans; } string num2str(int i) { stringstream ss; ss << i; return ss.str(); } int main() { int i, N, D, X; string A[301], a[301], ans; // A[i],a[i]分别代表第i天大牛、小牛数 while(cin >> N >> D >> X) { if(D>X) { cout << N/2*X + N << endl; continue; } A[0] = num2str(N); a[0] = div2(A[0]); for(i=1; i<D; i++) { A[i] = A[0]; a[i] = a[0]; } for(i=D; i<X; i++) { A[i] = MyAdd(A[i-1],a[i-D]); a[i] = div2(A[i]); } ans = A[X-1]; for(i=1; i<=D; i++) ans = MyAdd(ans,a[X-i]); cout << ans << endl; } return 0; }
原题:http://acm.nyist.net/JudgeOnline/problem.php?pid=114 AC:2014-01-18 15:28:42
这题只要用大数相加模板,用三个存储空间,即可很巧妙的进行递推运算。我想,涉及到斐波那契数列道理也是一样的。
#include <iostream> #include <string> using namespace std; string MyAdd(string s1, string s2) { if (s2.size() > s1.size()) swap(s1, s2); string::iterator p1 = s1.end(), p2 = s2.end(); while (p2 != s2.begin()) { *p1 += *p2 - '0'; if (*p1 > '9') *p1 -= 10, *(p1-1) += 1; p1--, p2--; } *p1 += *p2 - '0'; while (*p1 > '9') { *p1 -= 10; if (p1 == s1.begin()) { s1 = '1' + s1; break; } p1--; *p1 += 1; } return s1; } int main() { int i; string a, b, c; while(cin >> a >> b >> c) { for(i=1; i<33; i++) { a = MyAdd(MyAdd(a, b), c); b = MyAdd(MyAdd(a, b), c); c = MyAdd(MyAdd(a, b), c); } cout << MyAdd(MyAdd(a,b), c) << endl; } return 0; }