码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-02-11 21:35:25      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:++   font   代码   std   ret   大数   格式   大整数   mes   

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

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 (大数)

标签:++   font   代码   std   ret   大数   格式   大整数   mes   

原文地址:https://www.cnblogs.com/nr1999/p/8443023.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!