求关于n的阶乘结果后面有几个零?如2016的阶乘(网易的笔试选择题)

文章的原地址:http://blog.csdn.net/zyh2525246/article/details/53697136

一、阶乘数小的时候可以直接计算。

例如:求10!后面零的个数。很明显结果为3628800。   0的个数为2个。

    20!结果为2432902008176640000,0的个数为4个。而这个时候已经达到19位数了。

    更大的数,如果再直接去求。显然太麻烦了。

二、背后的规律

介绍一种求某个数阶乘结果后面零的个数的方法。

首先,出现零的情况就是 5 的倍数乘以偶数。

但是出现0的个数就不一定了,2*5=10 出现一个0。4*25=100会出现2个0。8*125=1000出现3个0.依次类推。

大家不难发现规律所在。4*25可以分解成2*5*2*5,8*125可以分解为2*5*2*5*2*5........

至于10,15,20 这些数 。 分解开,只会出现一个5,也就只会出现1个0。

至于50,75这些25的倍数,分解开,也只会出现2个5,与偶数相乘也只会出现2个0.

下面就是计算0的个数了。

上面也谈到了,偶数乘以5会出现一个0,乘以5的平方会出现2个0,乘以5的立方会出现3个0.

那么怎么计算阶乘里存在多少个5的倍数,25的倍数,125的倍数呢。而且,有个问题还需要注意,25,125也是5的倍数,125也是25的倍数。

例如 求100!后面0的个数。

由上所说的方法,是5的倍数的数有16(除去25的倍数),是25的倍数的数有4个,结果应该为16*1+4*2=24个0.

我们也可以换一种思维,出现一个5就是一个0,那么出现一个25就是2个0,如果5的倍数不排除25的倍数的话,每出现一个25的倍数,只加上1个0即可。

换句话说就是,0的个数就等于5的倍数的个数加上25的倍数的个数,即 20+4。

如果是求2016!后面0的个数呢?

同样按照上面的方法。

5的倍数个数为:  2016/5 = 403个

25的倍数个数为:  403/5 = 80个 

125的倍数的个数为:80/5 = 16个

625的倍数的个数为: 16/5 = 3个。

所以可以得出2016!后面0的个数为:403+80+16+3 = 502个.

如何用代码又该如何实现呢?

很简单,用一个简单的循环就能解决,当然递归算法更好。这里我们就只贴循环的代码了。

Scanner scanner = new Scanner(System.in);
System.out.print("请输入阶乘数:");
int a = scanner.nextInt();
int
count = 0;
for (; ;) {
a = a/5;
if (a == 0) {
break;
}else {
count+= a;
}
}
System.out.println("阶乘结果后面的零的个数为:"+
count);

结果如下:

请输入阶乘数:2016
阶乘结果后面的零的个数为:502

     

当然重在思想,代码没有什么说的。希望大家也学到了这个方法。虽然在在生活中用处不大,但是转换思想的方法还是挺管用的。


  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值