哈哈~要说这个题目,中午比赛的时候1AC了、、归功于之前写过的求大数的阶乘这个算法啊。。
在电脑上调试了一会,发现求阶乘的过程是一段段输出的。。就比如说10的阶乘,先输出362,然后8800,
知道了这点,那么求n的阶乘最后一个非0的数就变得很简单了。。只要加个while判断一下,就ok了、、
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 10005
int main(){
int i,j,len;
int n;
while(scanf("%d",&n) != EOF){
if(n == 0 || n == 1){
printf("%5d -> 1\n", n);
continue;
}
long s[N] = {1, 1};
len = 1;
for(i= 2; i <= n; i ++) {
for(j = 0; j < len; j ++)
s[j] = s[j] * i;
for(j = 0;j < len - 1; j ++) {
s[j+ 1] += s[j] / 10000;
s[j] = s[j] % 10000;
}
if(s[j] > 10000 ) {
s[j + 1] = s[j]/ 10000;
s[j] = s[j] % 10000;
len ++;
}
}
int tt;
int flag = 0;
for (int j = 0; j < len; j ++) {
flag = 0;
while (s[j] > 0) {
tt = s[j] % 10;
s[j] /= 10;
if(tt > 0) {
flag = 1;
break;
}
}
if(flag == 1) {
printf("%5d -> %d\n",n, tt);
break;
}
}
}
return 0;
}
好吧。看到他们的代码了、、好简单啊。。。
#include<cstdio>
int main()
{
int n,i;
long long s;
while(scanf("%d",&n)!=EOF)
{
s=1;
for(i=2;i<=n;i++)
{
s*=i;
while(s%10==0)s/=10;
s=s%100000;
}
printf("%5d -> %lld\n",n,s%10);
}
return 0;
}