首先这个题,它是求1000的阶乘,他最后的值太大了,以至于不能用int ,long long int 来求。那要怎求呢。那肯定是用最简单的数组来求鸭,用数组来代表它的每一个位。
#include <iostream>
#include<cstring>
using namespace std;
int a[4049];
首先先赋一个全局变量int a[4090],我主要是也不知道1000的阶乘有好大,然后我就值搞个4090,这么多,再怎么也够了吧;
int main()
{
int n,sum;
cin>>n;
memset(a,0,sizeof(a));
a[0]=1;
然后就赋初值咯,除了a[0]赋1,其他都赋0;
for(int i=2;i<=n;i++)
{
int c=0;
for(int j=0;j<4090;j++)
{
sum=a[j]*i+c;
a[j]=sum%10;
c=sum/10;
}
}
然后这一步也是最重要的一步,这个是用双重循环来求,然后其中的sum是来求每一位的值,则c是用来进位的,我们可以先举一个例子n=5,第一个sum就叫sum1吧,当i=2时,进入第二层循环j=0时,sum1=2;a[i]=2,c=0,因为c=0,然后其他数组a[1],a[2]等等都等于0,所以后面就不用算了还是全部都等于0,;然后就这样只要当sum大于10的时候c才大于0,然后下一个数就等于c,这就是进一位,然后依次求下去达到1000的阶乘。
int l;
for(l=4089;l>=0;l--)
{
if(a[l]!=0)
break;
}
for(int j=l;j>=0;j--)
{
cout<<a[j];
}
因为我存的数组很多,1000的阶乘的最后值不一有4090位,就用循环算出它在最大的一位在数组的哪里,最后在用倒序输出。
完整代码
#include <iostream>
#include<cstring>
using namespace std;
int a[4049];
int main()
{
// 请在此输入您的代码
int n,sum;
cin>>n;
memset(a,0,sizeof(a));
a[0]=1;
for(int i=2;i<=n;i++)
{
int c=0;
for(int j=0;j<4090;j++)
{
sum=a[j]*i+c;
a[j]=sum%10;
c=sum/10;
}
}
int l;
for(l=4089;l>=0;l--)
{
if(a[l]!=0)
break;
}
for(int j=l;j>=0;j--)
{
cout<<a[j];
}
return 0;
}
加油吧