高精度题目集锦

南阳理工 题目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++;
	}
	// 去掉前导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;
}



南阳理工 题目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;
}


你可能感兴趣的:(ACM,高精度)