高精度题目集锦

来源:互联网 发布:mac终端命令退出编辑 编辑:程序博客网 时间:2024/06/03 16:19

南阳理工 题目883 minecraft's cattles

       原题: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++;}// 去掉前导0while(*(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;}



南阳理工 题目114 某种序列

       原题: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;}


0 0
原创粉丝点击