末尾0的个数

这是滴滴打车的一道面试题,看似简单,其实不然,有点小技巧。

我刚看到这道题的时候,感觉很简单,于是三下五除二的写好了代码。

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;
/*输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2
输入描述:*/
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        long n=sc.nextLong();
        long sum=1;
        int l=0;
        for (long i = 1; i <=n; i++) {
            sum*=i;
        }
        System.out.println(sum);
        String ssum=String.valueOf(sum);
        char[] csum=ssum.toCharArray();
        for (int i = csum.length-1; i >=0 ; i--) {

            if('0'!=(csum[i])){

                break;
            }   
            l++;

        }
        System.out.println(l);
    }

}

逻辑简单明了,完全的线性逻辑。但是不巧的是即使我用Long类型,还是有溢出的现象,用比较小的数测试的时候,答案正确,但是。。。

真正的诀窍在这里:
先分析一下:
我们在计算n的阶乘时,实际上就是把所有小于等于n的正整数分解成质因数,然后再将其乘到一起,那么末尾0的个数实际上就是2*5的个数,而2的个数明显是很多很多的,所以问题就转化成了5的个数。即就每个数可以由几个5相乘,再把全部的5加到一起就是了。

原来是这样:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int res = 0;
        //计算出每个数里面有几个5。
        for(int i = n; i >= 5; i--) {
            int tmp = i;
            while(tmp % 5 == 0) {
                res++;
                tmp /= 5;
            }
        }
        System.out.println(res);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值