给定一个非负整数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)); } }