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

阶乘问题

时间:2018-03-15 11:53:40      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:define   nbsp   图片   gpo   问题   暴力   usaco   display   ret   

题目描述

也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:

12! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 = 479,001,600

12的阶乘最右边的非零位为6。

写一个程序,计算N(1<=N<=50,000,000)阶乘的最右边的非零位的值。

注意:10,000,000!有2499999个零。

输入输出格式

输入格式:

仅一行包含一个正整数N。

输出格式:

单独一行包含一个整数表示最右边的非零位的值。

输入输出样例

输入样例#1: 
12
输出样例#1: 
6

说明

USACO Training Section 3.2

解:

期望:100   实际:29

思路对了,但是忽略了精度问题

对于每次乘,结果至于最后的一位非0数有关,

但若是只保留一位,会出现丢失答案的情况

 

例子:

 

14!=87178291200。到这里我们的程序依然正确。result存贮的是2。

 

15!=1307674368000。然而,2*15=30,去0后是3而非正确的8。

 

事实上,我们存贮的应是12,12*15=180,去0后是18,个位是正确的8。

 

 

所以多保留几位,然后暴力乘即可

技术分享图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #define ll long long
 6 using namespace std;
 7 inline int read()
 8 {
 9     int x=0,w=1;char ch=getchar();
10     while(!isdigit(ch)){if(ch==-) w=-1;ch=getchar();}
11     while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-0,ch=getchar();
12     return x*w;
13 }
14 int n;
15 ll ans;
16 int main()
17 {
18     n=read();ans=1;
19     for(int i=2;i<=n;++i)
20     {
21         ans=ans*i;
22         while(ans%10==0) ans/=10;
23         ans=ans%10000000;
24     }
25     cout<<ans%10;
26     return 0;
27 }
View Code

 

阶乘问题

标签:define   nbsp   图片   gpo   问题   暴力   usaco   display   ret   

原文地址:https://www.cnblogs.com/adelalove/p/8572587.html

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