众所周知,当使用c语言的原生数据类型long long计算阶乘时,很容易造成溢出,那么就需要用到高精度算法来计算。
原理:
用数组保存数字,自己实现乘法的乘和进位
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <malloc.h>
typedef unsigned __int64 UINT64;
//计算阶乘结果的位数
UINT64 FactorDigit(UINT64 n) {
double s = 0;
for (int i = 1; i <= n; ++i) {
s += log10(i);
}
return (UINT64)s + 1;
}
//计算阶乘,返回值为数组长度
//数组第一个元素为高进制每一位对应的十进制位数,其余是数组数据(低位在前)
UINT64 Factor(UINT64 n, UINT64** pData, UINT64* pNdg) {
if (NULL == pData) {
return -1;
}
/*在进行乘法运算时时,每一位0 <= x < base都将与一个2 <= x <= n的值相乘,
*因此base的值既要保证(base - 1) * n不溢出,还要求最大值(base越大效率越高),
*还要是10的幂(方便输出)
*/
UINT64 unit; //高进制每一位对应的十进制位数
unit =