获取(阶乘)n!最右边那个非0数字

解题思路: 1.一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。
2.阶乘的增长速度非常快,eg:15!= 1307674368000,这个值已经非常大了,此题如果我们还是先把一个数字的阶乘先求出来,再去获取最后一个非0值,显然是非常困难的。
3.此题的目的是去计算n!最右边的那个非0的数字是多少,所以其实我们只需要知道阶乘的最后几位就可以得到了(注: 因为我们无法确定最后有几个0,所以我们得取4~5位).
具体代码如下:

import java.util.Scanner;

/**
 * 一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。
 * 任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。
 * 例如,5!=1*2*3*4*5=120,因此5!最右边的那个非0的数字是2。
 * 再如,7!=5040,因此7!最右边的那个非0的数字是4。
 * 再如,15!= 1307674368000,因此15!最右边的那个非0的数字是8。
 * 请编写一个程序,输入一个整数n(0<n<=100),然后输出n!最右边的那个非0的数字是多少。
 * @author hf
 *
 */
public class Blogs2 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("输入一个整数n(0<n<=100)");//在代码中没有这句话,我只是写个提示
		int n = scanner.nextInt();
		int sum = 1;
		for (int i = 1; i <= n; i++) {
			sum *= i;// 求阶乘
			// 消末尾0值
			while (sum % 10 == 0) {
				sum /= 10;
			}
			// 此题只需要最右边一位非0值,
			// 所以只要阶乘的最后几位继续循环进行阶乘计算即可
			sum %= 10000;
		}
		System.out.println(n + "!最右边的那个非0的数字是: " + (sum % 10));
		scanner.close();
	}
}

猜你喜欢

转载自blog.csdn.net/qq_45481524/article/details/106937325