hdoj 1042 N!(高精度)

来源:互联网 发布:切换字体的软件 编辑:程序博客网 时间:2024/04/29 14:13

Problem Description

Givenan integer N(0 ≤ N ≤ 10000), your task is to calculate N!

 

 

Input

OneN in one line, process to the end of file.

 

 

Output

Foreach N, output N! in one line.

 

 

Sample Input

1

2

3

 

 

Sample Output

1

2

6

 

一个阶乘题目,校赛时也有一道,当时觉得很难,现在发现那个还是简单的,这题才是难的。毕竟当时n的限制是3240,现在n<10000.再用以前的方法就toooooooold了

WA或者超空间都有,郁闷啊。

现在的做法是把a[]的数组每一位保存5位,这里要保证乘上10000后不会溢出。10000的阶乘大约是35660.

取100000为进位。     

还有一个要说明的是输出用%05d,保证格式,因为每位存的是5位数。

#include<stdio.h>int main(){    int i,j,n;    while(scanf("%d",&n)!=EOF)    {        int a[7201]={0};        a[0]=1;        for(i=2; i<= n;i++)        {            for(j=7200;j>=0;j--) a[j]=a[j]*i;            for(j=0;j<=7201;j++)            {                a[j+1]+=a[j]/100000;                a[j]%=100000;            }        }        j=7200;        while(!a[j])            j--;        printf("%d",a[j--]);        while(j>=0)            printf("%05d",a[j--]);        printf("\n");    }    return 0;}



再说下校赛那题的做法,两个字:打表。

1*2*3*……*3239*3240

#include <stdio.h>int a[3245][10005];void fuck(int i){        intj;        for(j=0;j<10005;j++)        {               a[i][j+1]+=a[i][j]/10;               a[i][j]%=10;        }}void find(int i){        intj;        for(j=0;j<10005;j++)               a[i-1][j]=a[i-2][j]*i;        fuck(i-1);}int main(){        inti,j;        intd;        for(i=0;i<3245;i++)               for(j=0;j<10005;j++)                       a[i][j]=0;        a[0][0]=1;        a[1][0]=2;        for(i=3;i<3245;i++)               find(i);        while(1)        {               scanf("%d",&d);               if(d==0)printf("1\n");               else               {                       if(d==-1)break;                       j=10003;                       while(a[d-1][j--]==0);                       for(j++;j>=0;j--)                               printf("%d",a[d-1][j]);                       printf("\n");               }        }        return0;}


做法很奇妙,当用在1042上把3240改成10005时,控制端出来后过了许久才能输入….>_<

 

 

还有奇葩的模板,另一种做法,不过也差不多

int factorial(int n){long a[10000];int i,j,l,c,m=0,w;a[0]=1; for(i=1;i<=n;i++)    {     c=0;     for(j=0;j<=m;j++)        {         a[j]=a[j]*i+c;         c=a[j]/10000;         a[j]=a[j]%10000;     }     if(c>0) {m++;a[m]=c;} } w=m*4+log10(a[m])+1;printf("\n%ld",a[m]); for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);return w;}

 

原创粉丝点击