【基础】n的阶乘尾部有多少个0
我们登堂入室--- 首先看下n的阶乘尾部有多少个0这道题
我们有很多思路可以去解决这道题 比如啊 我们可以先把他的阶乘结果求出来 然后我们转换为字符串 在一一判断是否为0不就完事了吗 这是很好的思路 但是 如果我们要求100或者1000的阶乘值呢 那么我们int 或 long 是不可以装下的 !!有些人说不切实际 那现实就是这样...
所以我们想到了解决办法: 我们都知道 一个数有末尾有多少个0 我们可以看这个数他同时有多少个2 和 5 的因子,因为 2 * 5 = 10 ;那么既然我们说装不下那么大的数 怎么判断这个值啊 ,所以说: 把他这个值拆分 各乘值 然后在判断各个乘值里有多少个 2 和 5 的因子数 全部(各乘值5 和 2 的因子)分别 累加起来,然后 2 和 5 的因子数对比 少的那个就是 这个数末尾的0了!
PS:此方法仅限于 各(乘值) 即:乘法
实现:求出n的阶乘尾部有多少个0 n的阶乘即:n 到 1 之间 那么用for循环即可实现 非常简单啊(认真看代码和注释)
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); //num是n的阶乘 int sum_2 = 0,sum_5 = 0; // 分别是 2的因子数 和 5的因子数 for(int i = num;i>0;i--){ // i等于num 每次递减 int t = i; //临时变量t 等于i 因为不可以改动i ..此时的t相当于每个乘积 while(t % 2 ==0){ //先判断有多少个2的因子 sum_2++; t/=2; //有的话/=2 } while(t % 5 == 0){ //再判断有多少5的因子 (顺序随便。。。) sum_5++; t/=5; //有的话/=5 } } System.out.print(sum_2 > sum_5?sum_5:sum_2); //然后我们判断谁少 就是多少个0 } }
有了以上经验 那么我们再出一题:
4岁的阿尔和6岁的爱德华是两兄弟,从小就对炼金术很有兴趣。一天,阿尔看到哥哥在算乘法,阿尔看了觉得很新奇,怎么哥哥计算出来的结果后面那么多圈圈,原来这是他们温柔的妈妈安排爱德华做的一道数学题,要他计算从a到b所有整数的乘积。妈妈看到阿尔看得那么入神,也想考验一下阿尔,对阿尔说:“你能数出哥哥计算的结果末尾的0有多少个吗?”,聪明的阿尔把计算结果看了1秒很快就把正确答案告诉妈妈,你也能和阿尔一样聪明吗?输入两个正整数a和b,求a到b之间(包含a、b)所有整数的积末尾有多少个0。
输入
【输入格式】
一行,分别表示a和b
输出
【输出格式】
一行,0的个数
样例输入
1 10
样例输出
2
其实和上面一样 但只需改变循环条件罢了
即:(看着代码思考···)
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int count_2 = 0; int count_5 = 0; for(int i = n;i <= m;i++){ int t = i; while(t % 2 == 0){ count_2++; t /= 2; } while(t % 5 == 0){ count_5++; t /= 5; } } System.out.print(count_2 > count_5 ? count_5 : count_2); } }