• 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

  • 相关阅读:
    焦点
    class类名的管理
    querySelector选择器
    DOM动态添加表格
    Java父类强制转换子类原则
    Maven精选系列--classifier元素妙用
    Git分支管理
    Eclipse代替Oracle接管Java EE
    细数Intellij Idea10个蛋疼问题!
    Git仓库操作命令
  • 原文地址:https://www.cnblogs.com/bi-hu/p/14176236.html
Copyright © 2020-2023  润新知