N的阶乘(10000) 51 nod——1057 (大数)

Posted 中单支援路死河道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了N的阶乘(10000) 51 nod——1057 (大数)相关的知识,希望对你有一定的参考价值。

像这些大整数加法或者乘法什么的思想都一样,就是截位存取,累积进位,最后逆序输出就可以啦

PS:小生是用10000来存取的,300MS就能A,如果单个存取有点危险,题目时间限制好像是1000ms,大家可以自己试试咯。(核心思想就是进位部分还有最后的边界的控制,逆序输出注意一下题目格式就可以了。  大整数加法的话因为牵扯长度问题所以只能按照字符串来存取并计算,一般这种不超过int的大整数乘除都可以用这种方法的)

AC 代码及详细解释如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 int a[30005];
 6 int main()
 7 {
 8     int t,n,i,j,k,m,l;
 9    while(~scanf("%d",&n))
10    {
11        memset(a,0,sizeof(a));
12        a[0]=1;
13        m=0;
14     for(i=2;i<=n;i++)
15     {
16         for(j=0;j<=m;j++)//每一位都相乘前边所有存取的
17         {
18             a[j]*=i;
19         }
20         for(l=1;l<=m;l++)//判断进位
21         {
22             if(a[l-1]>=10000)
23             {
24                 a[l]+=a[l-1]/10000;
25                 a[l-1]%=10000;
26             }
27 
28 
29         }
30         while(a[m]>=10000)//判断最后一位是否超过10000
31         {
32             a[m+1]=a[m]/10000;
33             a[m]%=10000;
34             m++;
35         }
36     }
37     for(i=m;i>=0;i--)//逆序输出
38     {
39         if(i==m)
40             printf("%d",a[i]);
41         else
42             printf("%04d",a[i]);
43     }
44     printf("\n");
45    }
46    return 0;
47 }

 

以上是关于N的阶乘(10000) 51 nod——1057 (大数)的主要内容,如果未能解决你的问题,请参考以下文章

51NOD 1057 N的阶乘

51nod1057 N的阶乘

51 Nod 1057 N的阶乘Java大数乱搞

51nod 1057 N的阶乘

51nod 1057 N的阶乘 (大数运算)

1057 N的阶乘(大数运算)