蓝桥备赛——求阶乘

题目一:

蓝桥备赛——求阶乘_第1张图片

 题的意思就是求阶乘,找到阶乘结果的零与输入数字相同零的个数,且是最小的数,并且k的范围是10十八次幂,如果是正常暴力,那么我们的时间复杂度可能是O(n^2),所以正常循环挨个求是不行的。

题涉及到的方法:二分,计算阶乘中含有质因子p的数量;

二分:

package 真题2;

import java.util.Scanner;

public class 求阶乘 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long k = sc.nextLong();
        long l = 1, r = (long) 1e20;//注意你的范围一定要比题个的大
//遍历数字
        while (l < r) {
            long mid = l + (r - l) / 2;
            if (query(mid) >= k) r = mid;
            else l = mid + 1;
        }
        long x = query(r);
        System.out.println(x == k ? r : -1);
    }

 
}

*统计零的个数直接看因子5的个数

   
//判断p的个数,在这里是5。

 static long query(long x) {
        long ans = 0;
        while (x > 0) {
            ans += x / 5;
            x /= 5;
        }
        return ans;
    }

整体代码

package 真题2;

import java.util.Scanner;

public class 求阶乘 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long k = sc.nextLong();
        long l = 1, r = (long) 1e20;
        while (l < r) {
            long mid = l + (r - l) / 2;
            if (query(mid) >= k) r = mid;
            else l = mid + 1;
        }
        long x = query(r);
        System.out.println(x == k ? r : -1);
    }

    static long query(long x) {
        long ans = 0;
        while (x > 0) {
            ans += x / 5;
            x /= 5;
        }
        return ans;
    }
}

你可能感兴趣的:(java比赛,算法,数据结构)