高精度阶乘
问题描述
-
问题描述:求一个非负整数
N
的阶乘的精确值(N
的大小保证N
的阶乘不超过3000
位)。 -
输入描述:多组测试数据,每组测试数据包含一行非负整数
N
。 -
输出描述:对于每组测试数据,输出一行答案。
-
样例输入:
3
10
50
-
样例输出:
6
3628800
30414093201713378043612608166064768844377641568960512000000000000
问题分析
-
要求多组输入
-
阶乘的大小不超过
3000
位,部分数据会超出整型的表示范围,因此考虑使用数组来接收阶乘的结果。 -
n! = 1*2*3...*(n-1)*n
考虑使用数组,并将数组下标0
处赋值为1
,利用for
循环,将数组依次从1
乘到n
,并把每次相乘的结果存到数组里面,0
下标处存个位,1
下标处存十位,依次类推。 -
数组从
1
乘到n
即数组的每个元素从1
乘到n
,即整数的每一位从1
乘到n
。
代码实现
1.计算阶乘
返回值:阶乘结果的位数
int calFactorial(int* factorial, int n)//计算n的阶乘
{
int carry = 0;//进位
int location = 1;//当前阶乘的位数
int i = 0;
for (i = 1; i <= n; i++)
{
int j = 0;
for (j = 0; j < location; j++)
{
factorial[j] = factorial[j] * i + carry;//结果为乘完加上之前的进位
carry = factorial[j] / 10;
factorial[j] %= 10;//获取进位
}
while (carry)//进行进位操作
{
factorial[location++] = carry % 10;
carry /= 10;
}
}
return location;
}
1.1 示例
2.输出
void printFactorial(int* factorial, int location)//输出
{
int i = 0;
for (i = location - 1; i > -1; i--)//输出阶乘结果
{
printf("%d", factorial[i]);
}
printf("\n");
}
3.main函数环境
int main()
{
int n = 0;
while (scanf("%d", &n) != EOF)//多组输入
{
int factorial[3005] = { 1 };//用于存储阶乘 - 个位初始化为1
int location = calFactorial(factorial, n);
printFactorial(factorial, location);
}
return 0;
}
4.头文件
#include <stdio.h>