题目描述
对于自然数N的阶乘,当N比较小时,可以32位整数int范围内准确表示
例如12!=479001600<2147483647(231-1)
而20!=2432902008176640000<9223372036854775807(263-1)可以在64位整数long long int范围内准确表示
但是N取值更大时,N!只能使用浮点数计算,从而产生误差
要求:输入自然数N(N≤50),准确计算自然数N的阶乘
说明50!≈3.04e+64,可以考虑定义数组存储计算结果的各位数字
输入
测试数据有多组,处理到输入结束
输出
每个输出占1行
样例输入
1
10
20
29
30
样例输出
1
3628800
2432902008176640000
8841761993739701954543616000000
265252859812191058636308480000000
#include <stdio.h>
int main()
{
int n;
int a[9000]; //确保保存最终运算结果的数组足够大
int digit = 1; //位数
int temp; //阶乘的任一元素与临时结果的某位的乘积结果
int i, j, carry; //carry:进位
while(scanf("%d",&n)!=EOF)
{
a[0] = 1; //将结果先初始化为1
digit = 1;
for ( i=2; i<=n; i++ ) //开始阶乘,阶乘元素从2开始依次"登场"
{ //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j=1, carry=0; j<=digit; j++ )
{
temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j-1] = temp % 10; //更新临时结果的位上信息
carry = temp / 10; //看是否有进位
}
while(carry)
{ //如果有进位
a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
carry = carry / 10; //看还能不能进位
}
}
for(j = digit; j >=1;j--)
{
printf("%d",a[j-1]);
}
printf("\n");
}
return 0;
}
int main()
{
int n;
int a[9000]; //确保保存最终运算结果的数组足够大
int digit = 1; //位数
int temp; //阶乘的任一元素与临时结果的某位的乘积结果
int i, j, carry; //carry:进位
while(scanf("%d",&n)!=EOF)
{
a[0] = 1; //将结果先初始化为1
digit = 1;
for ( i=2; i<=n; i++ ) //开始阶乘,阶乘元素从2开始依次"登场"
{ //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j=1, carry=0; j<=digit; j++ )
{
temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j-1] = temp % 10; //更新临时结果的位上信息
carry = temp / 10; //看是否有进位
}
while(carry)
{ //如果有进位
a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
carry = carry / 10; //看还能不能进位
}
}
for(j = digit; j >=1;j--)
{
printf("%d",a[j-1]);
}
printf("\n");
}
return 0;
}
温馨提示:答案为网友推荐,仅供参考