#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;
}
Je veux écrire un commentaire pour m'aider à comprendre, mais je ne peux pas continuer à écrire à mi-chemin. Pourquoi les trois lignes au milieu de for sont-elles écrites comme ça ?
Cela semble être juste un calcul vertical ordinaire de multiplication, il n'y a pas grand chose à dire
Étant donné que la multiplication dépassera int ou même long long, une haute précision est requise.
L'idée de la haute précision est d'utiliser un tableau pour stocker chaque chiffre du nombre, puis de simuler la méthode de multiplication verticale du calcul humain de multiplication.
Vous pouvez réfléchir à la façon de calculer un tableau a de longueur n fois un nombre x, en supposant que a est stocké de bas en haut (par exemple, le nombre 12345, le tableau est a[1]=5,a[2]= 4,une [3]=3,une[4]=2,une[5]=1).
Tout d'abord, tout le monde est a[1]x%10, mais quel est le chiffre des dizaines ? Il devrait être (a[2]x+report du chiffre précédent)%10
Donc ici, c représente le report du chiffre précédent, f[j] représente le j-ème bit de (i-1)! avant de boucler sur j, et après avoir bouclé sur j, il représente le j-ème bit de i!.