基础练习 阶乘计算
时间限制: 1 Sec 内存限制: 512 MB
题目描述
输入一个正整数n,输出n!的值。
其中n!=1*2*3*…*n。
算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入
输入包含一个正整数
n,
n<=1000。
输出
输出n!的准确值。
样例输入
10
样例输出
3628800
提示
来源
大数问题
这里有两种解法:
第一种解法:
#include <iostream>
using namespace std;
int main()
{
int n,i,j;
cin>>n;
int flag=1;
int carry=0; //设置进位
int res=0;
int str[10005]; //根据题目要求设置数组的大小
str[0]=1;
for (i=2; i<=n; i++) //从2开始计算阶乘
{
for (j=1; j<=flag; j++) //根据进位flag大小来判断当前阶乘结果的的位数
{
res=str[j-1]*i+carry;
str[j-1]=res%10;
carry=res/10;
}
while (carry)//当进位大于一时将结果扩展到下一位
{
flag++;
str[flag-1]=carry%10;
carry/=10;
}
}
for (i=flag-1; i>=0; i--) //将结果数组倒序输出,注意最后一位是"i=flag-1",因为"flag=1" 对应str[0],以此类推
{
cout<<str[i];
}
cout<<endl;
return 0;
}
第二种解法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int n,a[1005],s=0,t=0;
cin>>n;
a[0]=1;
for(int i=2; i<=n; i++)
{
for(int j=0; j<=s; j++)
{
a[j]=a[j]*i+t;
t=a[j]/10000;
a[j]=a[j]%10000;
}
while(t)
{
a[++s]=t%10000;
t=t/10000;
}
}
printf("%d",a[s]);
for(int i=s-1; i>=0; i--)
printf("%04d",a[i]);
cout<<endl;
return 0;
}