JAVA金典算法判断一个数(乘积得到的数)的末尾有几个0发掘

【基础】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);
        }
        }



本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/14176236.html

原文地址:https://www.cnblogs.com/bi-hu/p/14176236.html