JustOj 2043: N!

题目描述

输出N的阶乘。(注意时间限制150ms&&注意不能打表后输出,赛后我们会检查代码,如有发现,该位同学总分记0分处理)

打表的定义:在本地主机预先计算出了每个值对应的答案,并把输入和输出的映射直接写入所提交的代码。

输入

多组输入到文件结尾
每组输入一个整数n,(0<=n<=23)。

输出

每组测试数据输出一行,为n!。

样例输入
1
2
样例输出
1
2

题解:有两种办法,一个是用c++的高精度来写,第二种是用long long int去存乘积,但是不要全部都存,
把计算过程中所有的因子10提取出来(PS:sum只存去除后缀0的数),就是说例如如果遇到了5,就把sum除以2,
把标志末尾有多少个0的计数器++,最后吧sum输出,在循环输出全部的0
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <vector>
 6 #include <cstdlib>
 7 #include <iomanip>
 8 #include <cmath>
 9 #include <ctime>
10 #include <map>
11 #include <set>
12 #include <queue>
13 using namespace std;
14 #define lowbit(x) (x&(-x))
15 #define max(x,y) (x>y?x:y)
16 #define min(x,y) (x<y?x:y)
17 #define MAX 100000000000000000
18 #define MOD 1000000007
19 #define pi acos(-1.0)
20 #define ei exp(1)
21 #define PI 3.141592653589793238462
22 #define INF 0x3f3f3f3f3f
23 #define mem(a) (memset(a,0,sizeof(a)))
24 typedef long long ll;
25 ll gcd(ll a,ll b){
26     return b?gcd(b,a%b):a;
27 }
28 const int N=1e6+10;
29 const int mod=1e9+7;
30 int main()
31 {
32     ll n;
33     while(cin>>n){
34         ll pre=1;
35         string s="";
36         for(int i=2;i<=n;i++){
37             int x=i;
38             while(x%5==0){
39                 if(x%2==0)
40                     x/=2;
41                 else
42                     pre/=2;
43                 x/=5;
44                 s+='0';
45             }
46             pre*=x;
47         }
48         cout<<pre<<s<<endl;
49     }
50     return 0;
51 }
posted @ 2017-08-02 14:57  wydxry  阅读(340)  评论(0编辑  收藏  举报
Live2D