继续来一个比较综合的编程练习题,还是属于递归范围,我们先不用递归,用最常用的办法去解决,然后看看递归是如何解决的。个人觉得,必须要有第一种方法。比较第一种是一种正常的解题思路和思维过程,递归有时候我们不一定能想起来并实现。
需求:求1000的阶乘,这个结果数包含全部数字0的个数和尾部数字0的个数。例如一个数,1303087000,全部有5个0,尾部有3个0.
1.普通方法
简单来写一下思路。
1.1000的阶乘需要用BigInteger对象存储,肯定不能用int或者long类型。
2.BigInteger转成字符串,遍历字符串每一个字母
3.每一个字母和0比较,如果是0,计数器加1,得到计数器结果就是全部0的个数。
4.BigInteger对象转成字符串,然后转成StringBuffer对象,然后利用reverse()方法进行翻转
5.翻转之后字符串,遍历,全部尾部0都在翻转之后字符串前面
6.判断,遇到不是0就break循环,否则计数器加1,这个计数器就是尾部0的个数。
代码如下:
package io;
import java.math.BigInteger;
public class Test9 {
/**
* 需求:求1000的阶乘结果中尾部数字0的个数和全部数字0的个数
* 例如:100560000,全部0有6个,尾部0有4个
* @param args
*/
public static void main(String[] args) {
System.out.println(getAllNum(Fun()));
System.out.println(getTailNum(Fun()));
}
/*
* 计算1000的阶乘,返回一个BigInteger对象
*/
public static BigInteger Fun() {
//思考一下为什么不能用int类型
BigInteger bi1 = new BigInteger("1");
for(int i = 1; i <= 1000; i++) {
BigInteger bi2 = new BigInteger(i+"");
bi1 = bi1.multiply(bi2);
}
return bi1;
}
/*
* 先计算全部0的个数
*/
public static int getAllNum(BigInteger bi) {
// BigInteger转成字符串表现形式
String s1 = bi.toString();
System.out.println(s1);
//定义一个计数器
int count = 0;
//依次拿到字符串每一个字符,判断是否是0
for (int i = 0; i < s1.length(); i++) {
if('0' == s1.charAt(i)) {
count++;
}
}
return count;
}
/*
* 计算尾部0的个数
* 分析:
* 我们需要计算尾部的0的个数,我们需要把字符串反转过来,尾部的0都在字符串前面显示
* 然后遍历字符串每一个字符,是否和字符0去判断
* 是,计数器就加1,不是就break循环
*/
public static int getTailNum(BigInteger bi) {
//1.字符串实现反转,需要利用StringBuffer,String类本身没有rever()方法
StringBuffer sb = new StringBuffer(bi.toString());
//2.反转之后字符串形式
String s2 = sb.reverse().toString();
//定义计数器
int num = 0;
//3.遍历
for (int i = 0; i < s2.length(); i++) {
if( '0' != s2.charAt(i)) {
break;
}else {
num++;
}
}
return num;
}
}
可以得到,全部0的个数有 472,尾部0的个数有 249.
2.递归方法
这个地方,递归只能求尾部0的个数,规律就是5 15 20 25 这样的数字和偶数相乘肯定产生尾部0的数字。
package io;
public class Test10 {
/**
* 递归求出1000阶乘尾部和全部0的个数
* @param args
*/
public static void main(String[] args) {
System.out.println(Fun(1000));
}
public static int Fun(int num) {
if(num > 0 && num < 5) {
return 0;
}else {
return num / 5 + Fun(num / 5);
}
}
}
运行结果就是249,嗯,这递归找出规律,确实费脑子去理解,我还是喜欢第一种解题办法,第二种这种喜欢数学的人应该去掌握的。