示例#1
0
int digSumNum ( InfInt a, InfInt b ) {
	if ( b > a )
		a = b;
	int sum = 0;
	for ( char i = 0; i < a.numberOfDigits(); i ++ )
		sum += a.digitAt ( i );
	return sum;
}
示例#2
0
void simpleEuler20::calculateFactorial()
{
	InfInt sum = "1";
	for (int i = max; i > 0; i--) {
		sum = sum * i;
	}
	sumOfNumbers(sum.toString());
}
示例#3
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;
}
示例#4
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;
}
示例#5
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;
}
示例#6
0
文件: l2.cpp 项目: rolisz/hw3
vector<InfInt> trial_division_primes(InfInt n) {
    InfInt sqrt_n = n.intSqrt();
    vector<InfInt> divizori;
    InfInt i = 2;
    if (n % i == 0) {
        divizori.push_back(i);
    }
    i = 3;
    while (i <= sqrt_n) {
        if ((n % i) == 0) {
            divizori.push_back(i);
        }
        i+=2;
    }
    return divizori;
}
示例#7
0
文件: 56.cpp 项目: spikebarnett/euler
InfInt digitSum(const InfInt n)
{
	int retval=0;
	for(unsigned int i=0;i<n.numberOfDigits();++i) retval+=n.digitAt(i);
	return retval;
}