n的阶乘最后一个非0的数

来源:互联网 发布:java 判断object 类型 编辑:程序博客网 时间:2024/05/22 17:01

哈哈~要说这个题目,中午比赛的时候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;}