Java中IO流-35-递归练习-求1000的阶乘的所有零和尾部零的个数

继续来一个比较综合的编程练习题,还是属于递归范围,我们先不用递归,用最常用的办法去解决,然后看看递归是如何解决的。个人觉得,必须要有第一种方法。比较第一种是一种正常的解题思路和思维过程,递归有时候我们不一定能想起来并实现。

需求:求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,嗯,这递归找出规律,确实费脑子去理解,我还是喜欢第一种解题办法,第二种这种喜欢数学的人应该去掌握的。

你可能感兴趣的:(Java中IO流-35-递归练习-求1000的阶乘的所有零和尾部零的个数)