心胸决定格局,眼界决定境界...

大整数类

#include <vector>
#include <ostream>
#include <istream>
#include <iostream>
using namespace std;

typedef struct BigInteger {
	int BASE = 100000000;
	int width = 8;
	vector<int> s;

	BigInteger(long long num = 0)
	{
		*this = num;
	}
	BigInteger operator =(string num)
	{
		int len = num.length();
		int head = len % width;
		int times = len / width;
		int digits;
		for (int i = 1; i <= times; i++)
		{
			int start = len - i*width;
			int end = start + width;

			//将字符串变成整数
			sscanf(num.substr(start, width).c_str(), "%08d", &digits);
			s.push_back(digits);
		}
		;
		sscanf(num.substr(0, head).c_str(), "%d", &digits);
		s.push_back(digits);
		return *this;
	}

	BigInteger operator = (long long num)
	{
		s.clear();
		while (num)
		{
			int digit = num%BASE;
			s.push_back(digit);
			num /= BASE;
		}

		return *this;
	}



	BigInteger operator + (const BigInteger &num)
	{

		int jinwei = 0;
		vector<int> result;
		for (int i = 0;; i++)
		{
			if (jinwei == 0 && i >= num.s.size() && i >= s.size()) break;
			int sum = jinwei;
			if (i < num.s.size())
				sum = sum + num.s[i];
			if (i < s.size())
				sum = sum + s[i];
			result.push_back(sum % BASE);
			jinwei = sum / BASE;
		}


		return (*this);

	}

	BigInteger operator += (const BigInteger &num)
	{
		*this = *this + num;//num 和*this 还得讲究位置
		return (*this);
	}


	BigInteger operator += (long long num)
	{
		BigInteger tmp;
		tmp = tmp + num;
		return  tmp;
	}

	bool operator > (BigInteger big_data)
	{
		if (s.size() != big_data.s.size())
			return s.size() > big_data.s.size();
		for (int i = s.size() - 1; i >= 0; i--)
		{
			if (s[i] != big_data.s[i])
				return s[i] > big_data.s[i];
		}
		return false;
	}

	friend ostream& operator << (ostream &out, const BigInteger &data);
	friend istream& operator >> (istream &in, const BigInteger &data);
} BigInteger;


ostream& operator << (ostream &out, const BigInteger &data)
{
	out<< data.s.back();//头
	for (int i = data.s.size() - 2; i >= 0; i--)
	{
		//需要将其转成成字符串形式吗?
		//char buf[20];
		//sprintf(buf, "%08d", data.s[i]);
		//out << buf;
		out << data.s[i];
	}

	return out;
}
istream& operator >> (istream &in, BigInteger &data)
{
	string tmp;
	if (!(in >> tmp))  return in;
	data = tmp;
	return in;
}

	BigInteger data(123456789123);
	cout << data;

  

posted @ 2019-01-25 13:52  WELEN  阅读(69)  评论(0)    收藏  举报