阶乘——高精度求法

本文探讨了当计算较大数值的阶乘时,由于结果超出常规数据类型范围,需要使用高精度算法。通过模拟整数乘法过程,逐位相乘并进行进位,可以实现大数阶乘的计算。此外,为了提升效率,可以采用非十进制系统,如100进制或更高,但输出时需确保每位都有固定宽度。示例代码展示了具体的实现方式。
摘要由CSDN通过智能技术生成

n! = n * (n-1) * (n-2) * ...* 2 * 1

我们经常说一个算法的时间复杂度是指数级或者阶乘级的非常恐怖的。因为一个很小的数阶乘的结果是很大的一个数。12!=479 001 600, 13!就已经超过了int的表示范围。所以当我们要求一个很大的数的阶乘时,必须使用高精度来表示,否则越界。

阶乘的高精度运算可以模拟一个整数与一个大整数的乘法运算,具体运算过程就和做手算乘法一样,无非是每位相乘,超过10进1

注意:上面说的十进一是十进制运算,每一位表示0~9之间的数,为了提高运算速度,我们还可以以100进制,1000进制,10000进制。。。来进行运算。这就有点类似于基数排序的每个桶的表示范围一样。但是如果不是十进制,需要注意一点的就是,假设100进制,我们得到的第i位数是1,当我们输出结果时,如果直接输出1,显然结果不对,我们应该保证每位都占有两位数。


具体代码如下

#include <stdio.h>
#include <string.h>

const int MAXBIT = 40000;

const int BIT = 10000;

int d[MAXBIT];
int f[MAXBIT];

void BigNumberMultiplyWithN(int *digital, int n, int &bitnum)
{
	int i;
	
	//digital[bitnum] = 0;
	for (i = 0; i < bitnum; i++)
	{
		digital[i] *= n;
	}
	for (i = 0; i < b
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值