#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;
}
Saya ingin menulis komen untuk membantu diri saya memahami, tetapi saya tidak boleh terus menulis separuh jalan. Mengapa tiga baris di tengah untuk ditulis seperti itu?
Nampaknya hanya pengiraan pendaraban menegak biasa, tiada apa yang perlu diperkatakan
Oleh kerana pendaraban akan melebihi int atau panjang panjang, ketepatan tinggi diperlukan.
Idea ketepatan tinggi ialah menggunakan tatasusunan untuk menyimpan setiap digit nombor, dan kemudian mensimulasikan kaedah pendaraban menegak bagi pengiraan pendaraban manusia.
Anda boleh mempertimbangkan cara mengira tatasusunan a dengan panjang n darab nombor x, dengan mengandaikan bahawa a disimpan dari rendah ke tinggi (contohnya, nombor 12345, tatasusunan ialah a[1]=5,a[2]= 4,a [3]=3,a[4]=2,a[5]=1).
Pertama sekali, semua orang ialah [1]x%10, tetapi apakah digit sepuluh Ia sepatutnya (a[2]x+bawaan digit sebelumnya)%10
Jadi di sini, c mewakili bawaan? daripada digit sebelumnya , f[j] mewakili bit ke-j bagi (i-1) sebelum menggelung ke j, dan selepas menggelung ke j, ia mewakili bit ke-j bagi i!.