C语言old阶乘,计算任意大的数的阶乘,示出所有的数字

可以接受的答案很好,但这是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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值