POJ 1604 求n的阶乘的最后位非0数字

题目链接:http://poj.org/problem?id=1604

今天彪给我出了个小题,还是蛮有启发的。
这个题目如题就是简单的求n的阶乘的最后位非0数字,如果你还在想求出阶乘再算出最后一位,那么孩子你想太多了,n范围大些呢,题目中要求是n 小于 100000,这个已经彻底消灭了一个个试的心。
最开始的思路很简单,设一个循环变量从1-n,依次乘到累乘变量s中,只保留s的最后几位非零数字代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*错误算法,忽略5的倍数对结果可能带来的影响
*/
#include <iostream>
#include <iomanip>
using namespace std;
void main()
{
long int n,m=1,i;
cin>>n;
for(i=1;i<=n;i++)
{
m*=i;
while(1)
{
if(m%10==0)
m=m/10;
else
{
m=m%10;
break;
}
}
}
cout<<m;
}


稍作修改后,查阅poj发现正是是1604 ,顺便修改以完成题目,。代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
long int m=1,i;
for(i=1;i<=n;i++)
{
m*=i;
while(m%10==0)
m=m/10;
m=m%100000;
}
cout<<setw(5)<<n<<" -> "<<setw(1)<<m%10<<endl;
}
}