示例#1
0
InfInt InfInt::operator*(ELEM_TYPE rhs) const
{//PROFILED_SCOPE
	InfInt result = *this;
	ELEM_TYPE factor = rhs < 0 ? -rhs : rhs;
	multiplyByDigit(factor, result.val);
	result.correct();
	result.pos = (result.val.size() == 1 && result.val[0] == 0) ? true : (pos == (rhs >= 0));
	return result;
}
示例#2
0
InfInt InfInt::operator-(const InfInt& rhs) const
{//PROFILED_SCOPE
	InfInt result;
	result.val.resize(val.size() > rhs.val.size() ? val.size() : rhs.val.size(), 0);
	for (size_t i = 0; i < val.size() || i < rhs.val.size(); ++i)
	{
		result.val[i] = (i < val.size() ? (pos ? val[i] : -val[i]) : 0) - (i < rhs.val.size() ? (rhs.pos ? rhs.val[i] : -rhs.val[i]) : 0);
	}
	result.correct();
	return result;
}
示例#3
0
InfInt InfInt::operator*(const InfInt& rhs) const
{//PROFILED_SCOPE
	InfInt result;
	result.val.resize(val.size() + rhs.val.size(), 0);
	PRODUCT_TYPE carry = 0;
	size_t digit = 0;
	for (;; ++digit)
	{//PROFILED_SCOPE
	 //result.val[digit] = (ELEM_TYPE) (carry % BASE);
	 //carry /= BASE;

		PRODUCT_TYPE oldcarry = carry;
		carry /= BASE;
		result.val[digit] = (ELEM_TYPE)(oldcarry - carry * BASE);

		bool found = false;
		for (size_t i = digit < rhs.val.size() ? 0 : digit - rhs.val.size() + 1; i < val.size() && i <= digit; ++i)
		{//PROFILED_SCOPE
			PRODUCT_TYPE pval = result.val[digit] + val[i] * (PRODUCT_TYPE)rhs.val[digit - i];
			if (pval >= BASE || pval <= -BASE)
			{//PROFILED_SCOPE
			 //carry += pval / BASE;
			 //pval %= BASE;

				PRODUCT_TYPE quot = pval / BASE;
				carry += quot;
				pval -= quot * BASE;
			}
			result.val[digit] = (ELEM_TYPE)pval;
			found = true;
		}
		if (!found)
		{//PROFILED_SCOPE
			break;
		}
	}
	for (; carry > 0; ++digit)
	{//PROFILED_SCOPE
		result.val[digit] = (ELEM_TYPE)(carry % BASE);
		carry /= BASE;
	}
	result.correct();
	result.pos = (result.val.size() == 1 && result.val[0] == 0) ? true : (pos == rhs.pos);
	return result;
}