可以接受的答案很好,但这是C ++。我们可以做得更好。让我们Bignum以完全不受限制的位数开始我们自己的课堂。
为了获得最高的效率,我们将使用纯二进制数,将每个数组元素包装成我们可以有效处理的尽可能多的位。比较简单的方法是在每个元素中存储一个十进制数字。在这里,我做了一个妥协,在每个uint32_t元素中存储9个十进制数字。
数据存储vector为低端(little-endian)存储,因为当需要更高阶元素时,在末尾扩展a更容易。
一旦有了此类,阶乘函数就是简单性本身。
#include
#include
#include
#include
#include
class Bignum
{
public:
Bignum(int value)
{
assert(value >= 0 && value <= 999999999);
parts.push_back(value);
}
Bignum& operator*=(int rhs)
{
assert(rhs >= 0 && rhs <= 999999999);
uint32_t carry = 0;
for (size_t i = 0; i < parts.size(); i++)
{
uint64_t product = (uint64_t)parts[i] * (uint64_t)rhs + carry;
parts[i] = (uint32_t)(product % 1000000000LL);
carry = (uint32_t)(product / 1000000000LL);
}
if (carry != 0)
parts.push_back(carry);
return *this;
}
friend std::ostream & operator<
private:
std::vector parts;
};
inline std::ostream& operator<
{
char oldfill = stream.fill('0');
for (std::vector::const_reverse_iterator it = num.parts.rbegin(); it != num.parts.rend(); it++)
stream << *it << std::setw(9);
stream.fill(oldfill);
stream.width(0);
return stream;
}
Bignum factorial(int n)
{
Bignum fac = 1;
for (int i = 2; i <= n; i++)
fac *= i;
return fac;
}
int main(int argc, char* argv[])
{
for (int n = 0; n <= 52; n++)
std::cout << factorial(n) << std::endl;
return 0;
}