#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int max=3000;
int f[3000];
int main()
{
int i,j,n;
scanf("%d",&n);
memset(f,0,sizeof(f));
f[0]=1;
for(i=2;i<=n;i++) //从i乘到n
{
int c=0;
for(j=0;j<3000;j++) //每一位在乘法时的调整
{
int s=f[j]*i+c;
f[j]=s%10;
c=s/10;
}
}
for(j=3000-1;j>=0;j--)
if(f[j]) break;
for(i=j;i>=0;i--)
cout<<f[i];
return 0;
}
Ich möchte einen Kommentar schreiben, um mir das Verständnis zu erleichtern, aber ich kann nicht mittendrin weiterschreiben. Warum sind die drei Zeilen in der Mitte so geschrieben?
好像就是普通的竖式计算乘法吧,没啥好说的
由于乘法会超过int甚至long long,所以要用高精度。
高精度的思路是用数组来存数字的每一位,然后模拟人计算乘法的竖式乘法方法。
你可以考虑如何计算一个长度为n的数组a乘以一个数x,假设a是从低位到高位存储的(比如数字12345,数组就是a[1]=5,a[2]=4,a[3]=3,a[4]=2,a[5]=1)。
首先各位就是a[1]x%10,但是十位是什么呢,应该是(a[2]x+上一位的进位)%10
所以这里,c表示的就是上一位的进位,f[j]在循环到j之前表示的是(i-1)!的第j位,循环到j后是i!的第j位。