高精度N!

来源:互联网 发布:scrach源码 编辑:程序博客网 时间:2024/04/30 01:41

code1:

最开始的写法是一位一位的乘,而且每次没有计算ans数组的长度,所以速度很慢~

472 KB3484 msG++595 B

#include<stdio.h>#include<iostream>#include<string.h>using namespace std;const int N=40000;int ans[N];int main(){    int n;    while(~scanf("%d",&n))    {      memset(ans,0,sizeof(ans));      ans[0]=1;      for(int i=2;i<=n;i++)      {          int c=0;          for(int j=0;j<N;j++)          {              int s=ans[j]*i+c;              ans[j]=s%10;              c=s/10;          }      }      int j;      for(int i=N-1;i>=0;i--)      {          if(ans[i]){j=i;break;}      }      for(int i=j;i>=0;i--)printf("%d",ans[i]);      printf("\n");    }    return 0;}

进化版:

int 为10 的9位 所以最多可以是四位数乘以四位数..即每一个数组储存的是一个四位数,注意输出 %04d,并且加入了每次数组的长度计算,速度快了很多~

264 KB265 msG++721 B

#include<stdio.h>#include<iostream>#include<string.h>using namespace std;const int maxx=40000;const int ma=10000;int a[maxx];int main(){    int n;    while(~scanf("%d",&n))    {        int len=1;        //memset(a,0,sizeof(a));        a[1]=1;        for(int i=1;i<=n;i++)        {            int c=0;            for(int j=1;j<=len;j++)            {                int s=c+a[j]*i;                a[j]=s%ma;                c=s/ma;            }            if(c!=0)            {                a[++len]=c;            }        }        printf("%d",a[len]);        for(int i=len-1;i>=1;i--)            printf("%04d",a[i]);        printf("\n");    }    return 0;}


0 0
原创粉丝点击