编写程序,求n!(n的值要能大于13),其结果用一个不超过64位的十进制数输出。
输入格式:
输入一个非负整数,其值介于2到49之间的数。
输出格式:
对每一个输入的整数,在一行中输出相应的阶乘值,输出结果的高位用0填充。
输入样例1:
在这里给出一组输入。例如:
7
输出样例1:
在这里给出相应的输出。例如:
5040
输入样例2:
在这里给出一组输入。例如:
49
输出样例2:
在这里给出相应的输出。例如:
608281864034267560872252163321295376887552831379210240000000000
我的答案:
经典的大数求和,不能使用 int , double 类型的数据存储,只能使用数组来进行存储
#include <stdio.h>
#define max 10000
int main(void)
{
int n, count = 0;
int digit[max + 1] = {1}; // 定义存储阶乘结果的数组,初始值为1
scanf("%d", &n); // 输入非负整数n
int front = 0; // 进位,初始值为0
for (int i = 2; i <= n; i++) // 从2到n依次乘以数组中的数进行阶乘运算
{
for (int j = 0; j <= max; j++) // 逐位相乘
{
int temp = digit[j] * i + front; // 当前位的乘积加上进位值
digit[j] = temp % 10; // 当前位的值,即乘积结果的个位数
front = temp / 10; // 进位值,即乘积结果的十位数及以上
}
}
if (front)
printf("%d", front); // 如果有进位,输出最高位的进位值
for (int i = max; i >= 0; i--)
{
if (digit[i] != 0) // 输出高位非零的部分
{
for (i; i >= 0; i--) // 输出高位非零的部分
printf("%d", digit[i]);
}
}
return 0;
}