乘积尾零(Java详解)

简介: 乘积尾零(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,去除前面的位数

代码实现:

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
       int count = 0;//统计尾零的个数
       int m = 1;//乘积
       for(int i = 0; i < 100; i++){
           int n = scan.nextInt();
           m *= n;
           //统计零的个数,并去除m的尾零
           while(m > 0){
               if(m % 10 == 0){
                   count++;
               }else{
                   break;
               }
               m /= 10;
           }
           //去除m前面的位数,防止溢出
           m %= 10000;
       }
       System.out.println(count);
       scan.close();
   }
}

方法二

为什么两个数相乘的结果末尾会有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个数中的最小值,就可得出乘积的尾零个数

代码实现:

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
       //分别统计2和5的个数
       int twoCount = 0;
       int fiveCount = 0;
       for(int i = 0; i < 100; i++){
         int n = scan.nextInt();
         int m = n;
         while(n % 2 == 0){
           twoCount++;
           n /= 2;
         }
         while(m % 5 == 0){
           fiveCount++;
           m /= 5;
         }
       }
       //判断2和5的个数哪一个更少,得出有多少对2和5
       int ret = twoCount < fiveCount ? twoCount: fiveCount;
       System.out.println(ret);
       scan.close();
    }
}

题目来自:

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

目录
相关文章
|
3月前
|
算法 Java 索引
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
35 0
|
6月前
|
C++ Java Go
Java每日一练(20230425) 乘积最大子数组、插入区间、删除有序数组中的重复项II
Java每日一练(20230425) 乘积最大子数组、插入区间、删除有序数组中的重复项II
50 0
Java每日一练(20230425) 乘积最大子数组、插入区间、删除有序数组中的重复项II
|
算法 Java
三个数的最大乘积(力扣 628)Java
给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
|
Java BI
构建乘积数组(剑指offer 66)Java双向遍历
给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。
|
Java
力扣——713. 乘积小于 K 的子数组(Java、C实现百分百击败)
力扣——713. 乘积小于 K 的子数组(Java、C实现百分百击败)
90 0
力扣——713. 乘积小于 K 的子数组(Java、C实现百分百击败)
|
算法 Java
动态规划解决最大乘积系列问题(碾压暴力枚举)java
动态规划( Dynamic Programming )算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
187 0
ZZULIOJ-1085,求奇数的乘积(多实例测试)(Java)
ZZULIOJ-1085,求奇数的乘积(多实例测试)(Java)
ZZULIOJ-1046,奇数的乘积(Java)
ZZULIOJ-1046,奇数的乘积(Java)
|
8天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
80 38
|
6天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?