阶乘数小的时候可以直接计算。
例如:求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
当然,重在思想,代码没有什么好说的。希望大家也学到了这个方法。虽然在在生活中用处不大,但是转换思想的方法还是挺管用的。