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

hdu1042--N!

时间:2015-03-30 22:53:12      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1042

想一下10000!一定非常大结果不能一次性输出,所以我们可以采用数组来保存结果;

eg:100!=100*99*98*...*2*1;

我们可以让9900*98...可以转换成大整数乘小整数;

结果假如是:12 3456 7890;

a[0]=7890;a[1]=3456;a[0]=12;

具体过程如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstdlib>
 7 #include<cstring>
 8 using namespace std;
 9 #define maxn 10010
10 
11 int a[maxn];//每个元素里存4位;不然10000的阶乘位数太多会超限; 
12 
13 void PUL(int a[],int k)
14  {
15     for(int i=0; i<maxn; i++)
16     {
17         a[i]=a[i]*k;
18     }
19     for(int i=0; i<maxn; i++) //进行进位,保证每个元素都含有4位
20     {
21         a[i+1]+=a[i]/10000;
22 
23         a[i]%=10000;
24     }
25 }
26 
27 void PUT(int a[]) 
28 {
29     int len;
30 
31     for(int i=maxn-1; i>=0; i--)
32      {
33         if(a[i]!=0) 
34         {
35             len=i;
36             break;
37         }
38     }
39     printf("%d",a[len]);//末位单独输出;eg:12 0000 0000; 
40     for(int i=len-1; i>=0; i--)
41     {
42         printf("%04d",a[i]); 
43     }
44     cout<<endl;
45 }
46 int main()
47  {
48     int n;
49 
50     while(cin>>n) 
51     {
52         memset(a,0,sizeof(a));
53 
54         a[0]=1;//0!=1; 
55 
56         for(int i=1; i<=n; i++) 
57         {
58             PUL(a,i);
59         }
60         PUT(a);
61     }
62     return 0;
63 }

 

hdu1042--N!

标签:

原文地址:http://www.cnblogs.com/zhengguiping--9876/p/4379195.html

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