hdoj 1042 N!(还是对大数的处理)

来源:互联网 发布:电力安全带实验数据 编辑:程序博客网 时间:2024/05/22 15:29

初略估计10000!的阶乘会有将近3000位数。

用二维数组每个单元保存一位数最后会内存溢出,所以我们每个单元保存4位数,减少数组的大小。

注意输出时的细节,每个单元保存4位数,如果数是0的话,要以%04输出。

#include<stdio.h> using namespace std;#define M 10001#define N 10001int a[N][M]={0};int len[N];void change(){int i,j,l,r,temp;l=1;a[0][0]=1;len[0]=1;for(i=1;i<N;i++){for(j=0;j<l;j++) {a[i][j]=a[i-1][j]*i;}r=0;for(j=0;j<l;j++){temp=a[i][j]+r;a[i][j]=temp%10000;r=temp/10000;}while(r){a[i][l++]=r%10000;r=r/10000;}len[i]=l;}}int main(){int n,i;change();while(~scanf("%d",&n)){if(len[n]==1) printf("%d\n",a[n][0]);else{printf("%d",a[n][len[n]-1]);for(i=len[n]-2;i>=0;i--)printf("%04d",a[n][i]);printf("\n");}}return 0;}