求n的阶乘有很多方法,最简单的就是迭代法。但是当n特别大时,就超出了c语言中的数据范围。这时就可以采用高精度算法。把迭代的结果进行拆分后保存在数组中,拆分的位数视情况而定。例如:
如果要计算 1024 * 5,可以把1024拆分成10, 24两个数保存在int数组中,a[0] = 24, a[1] = 10.在遍历数组,让每个元素与5相乘后保存在数组中,进位加在高位上,最后输出结果。
int a[2] = { 24, 10 };
int carry = 0;
for (int i = 0; i < 2; i++)
{
a[i] = a[i] * 5 + carry;
carry = a[i] / 100;
a[i] %= 100;
}
for (int i = 2; i > 0; i--)
{
printf("%d", a[i - 1]);
}
printf("\n");
求n的阶乘在迭代过程中就可以使用此方法避免数据溢出。
#include <stdio.h>
#include <stdlib.h>
const long long MAX = 10000000;
int main()
{
int n, i, j, count;
long long number[10000], carry;
scanf("%d", &n);
count = 0;
number[0] = 1;
for (i = 1; i <= n; i++)
{
carry = 0;
for (j = 0; j <= count; j++)
{
number[j] = number[j] * i + carry;
carry = number[j] / MAX;
number[j] %= MAX;
}
if (carry > 0)
{
count++;
number[count] = carry;
}
}
printf("%lld", number[count]);
for (i = count - 1; i >= 0; i--)
{
printf("%0.8lld", number[i]);
}
printf("\n");
return 0;
}