057 有关阶乘的两个问题
Table of Contents

ac

给定一个非负整数N,如果用二进制数表达N!的结果,返回最低位的1在哪个位置上,认为最右的位置为位置0

最低位的1在哪个位置上,取决于1-n的数中因子2又多少个,因为只要出现一个因子2,最低位的1就会向左移动一位。所以

把n!的结果中因子2的总个数极为z

z = n/2 + n/4 + n/8 ....
import java.util.*;


public class Main {

    public static Scanner sc = new Scanner(System.in);

    // 时间复杂度 O(logn)
    static long numOfZero(long n){
       long num = 0;
       long i = 2;
       while (n > 0){
           num += n / i;
           n = n / i;
       }
       return num;
    }

    public static void main(String[] args) {
        long n = sc.nextLong();
        System.out.println(numOfZero(n));
    }

}