• 乘积尾零(Java详解)


    目录

    一、题目描述

    二、题解

    方法一

    方法二


    一、题目描述

    如下的10行数据,每行有10个整数,请你求出他们的乘积的末尾有多少个零?

    5650 4542 3554 473 946 4114 3871 9073 90 4329

    2758 7949 6113 5659 5245 7432 3051 4434 6704 3594

    9937 1173 6866 3397 4759 7557 3070 2287 1453 9899

    1486 5722 3135 1170 4014 5510 5120 729 2880 9019

    2049 698 4582 4346 4427 646 9742 7340 1230 7683

    5693 7015 6887 7381 4172 4341 2909 2027 7355 5649

    6701 6645 1671 5978 2704 9926 295 3125 3878 6785

    2066 4247 4800 1578 6652 4616 1113 6205 3264 2915

    3966 5291 2904 1285 2193 1428 2265 8730 9436 7074

    689 5510 8243 6114 337 4096 8199 7313 3685 211

    二、题解

    思路分析:

    题目要求我们求出这100个数相乘的结果末尾有多少个零,因此我们只需关注末尾的零。若直接相乘最后求乘积的末尾有多少个零,由于相乘所得数据太大,会导致溢出,因此不能通过直接求所有数乘积的方法来求得尾零个数,那该如何求出尾零的个数呢?

    方法一

    由于直接相乘所得的数据太大,因此我们可以每乘上一个数,就计算乘积的结果末尾有多少个零,由于结果末尾的零不影响前面数字的运算,我们使用计数器count加上结果末尾的零后,就可将尾部的零去除,用去除末尾零后的结果继续计算

    但即使如此,因为相乘的100个数较大,每次去除零后再相乘,结果也很大,也可能会溢出,由于结果最前面的位数也不会影响结果末尾0的个数,因此我们可以将结果 %10000 去除结果前面的位数,防止结果溢出

    具体实现:

    使用计数器count统计尾零的个数,遍历这100个数,每乘上一个数就统计其尾零的个数,计数器相加,并去除尾零,再将结果%10000,去除前面的位数

    代码实现:

    1. import java.util.Scanner;
    2. // 1:无需package
    3. // 2: 类名必须Main, 不可修改
    4. public class Main {
    5. public static void main(String[] args) {
    6. Scanner scan = new Scanner(System.in);
    7. //在此输入您的代码...
    8. int count = 0;//统计尾零的个数
    9. int m = 1;//乘积
    10. for(int i = 0; i < 100; i++){
    11. int n = scan.nextInt();
    12. m *= n;
    13. //统计零的个数,并去除m的尾零
    14. while(m > 0){
    15. if(m % 10 == 0){
    16. count++;
    17. }else{
    18. break;
    19. }
    20. m /= 10;
    21. }
    22. //去除m前面的位数,防止溢出
    23. m %= 10000;
    24. }
    25. System.out.println(count);
    26. scan.close();
    27. }
    28. }

    方法二

    为什么两个数相乘的结果末尾会有0?

    因为这两个数字的约数里有2和5,10 = 2*5,一个2和一个5相乘产生一个末尾0有多少对2和5,结果的末尾就会有多少个0。

    例如:

    40 = 2*2* 2*5(一对2和5)

    30 = 3 * 2*5 (一对2和5)

    100 = 2*5 * 2*5;(两对2和5)

    因此,我们只需要计算这100个数中有多少个2和多少个5,再取其最小值得到一共有多少对2和5,就可得出乘积的尾零个数

    具体实现:

    (1)遍历这100个数,分别求出2和5的个数

    (2)求出2和5个数中的最小值,就可得出乘积的尾零个数

    代码实现:

    1. import java.util.Scanner;
    2. // 1:无需package
    3. // 2: 类名必须Main, 不可修改
    4. public class Main {
    5. public static void main(String[] args) {
    6. Scanner scan = new Scanner(System.in);
    7. //在此输入您的代码...
    8. //分别统计2和5的个数
    9. int twoCount = 0;
    10. int fiveCount = 0;
    11. for(int i = 0; i < 100; i++){
    12. int n = scan.nextInt();
    13. int m = n;
    14. while(n % 2 == 0){
    15. twoCount++;
    16. n /= 2;
    17. }
    18. while(m % 5 == 0){
    19. fiveCount++;
    20. m /= 5;
    21. }
    22. }
    23. //判断2和5的个数哪一个更少,得出有多少对2和5
    24. int ret = twoCount < fiveCount ? twoCount: fiveCount;
    25. System.out.println(ret);
    26. scan.close();
    27. }
    28. }

    题目来自:

    乘积尾零 - 蓝桥云课 (lanqiao.cn)

  • 相关阅读:
    Android存储:轻松掌握MMKV
    国际版腾讯云/阿里云:云解析DNS是什么
    训练正常&异常的GAN损失函数loss变化应该是怎么样的
    前端不使用 il8n,如何优雅的实现多语言?
    SpringBoot统一封装controller层返回的结果
    Wireshark数据抓包分析之域名系统协议
    牛客 HJ27 查找兄弟单词
    Python 连接 ES 的 API 用例:获取满足条件的索引列表
    Python学习----异常、模块、安装第三方包
    redis 06 集群
  • 原文地址:https://blog.csdn.net/2301_76161469/article/details/134340140