蓝桥杯(JAVA B组)2022第五题:求阶乘

问题描述

满足 NN ! 的末尾恰好有 KK 个 0 的最小的 NN 是多少?

如果这样的 NN 不存在输出 -1−1 。

输入格式

一个整数 KK

输出格式

一个整数代表答案。

样例输入

2

样例输出

10

评测用例规模与约定

对于 30 \%30% 的数据, 1 \leq K \leq 10^{6}1≤K≤106.

对于 100 \%100% 的数据, 1 \leq K \leq 10^{18}1≤K≤1018.

运行限制

  • 最大运行时间:3s

  • 最大运行内存: 512M

原来代码(样例输入2,输出一样,但提交不通过(10%)为什么啊!!???):

import java.util.Scanner;
class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int K = sc.nextInt();
        for(int N = 1;N<10000;N++) {
            int y = N;
            int j=1;
            for(int i = 1;i<=y;i++) {//算阶乘
                j*=i;
            }
            if(k(j,K)) {//调用,判断是否符合
                System.out.println(y);
                return;//输出后就结束
            }
        }
        System.out.println(-1);//如果不存在就输出-1
    }
    public static boolean k(int j,int K) {
        int a = 0;
        int sum = 0;
        while(j!=0) {
            a=j%10;
            if(a!=0) {//记得写!!如果末尾不是0就停止
                break;
            }
            if(a==0) {
                sum++;
            }
            j/=10;
        }
        if(sum==K) {//如果末尾0的个数等于k就返回true
            return true;
        }
        return false;
    }
}

第一种解法

暴力查找

代码:

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        long k = scanner.nextLong();
        long count;
        long a = 5;
        while (true) {
            long tempA = a;
            count = 0;
            while (tempA > 0) {
                tempA /= 5;
                count += tempA;
            }
            if (count < k) {
                a += 5;
            } else if (count == k) {
                System.out.println(a);
                break;
            } else {
                System.out.println(-1);
                break;
            }
        }
        scanner.close();
    }
}

第二种解法

二分查找法,10^18对应的值可以多尝试几个就可以找到了,可以根据45、405、4005这样的大致范围找

代码:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        
        try (Scanner scanner = new Scanner(System.in)) {
            long k = scanner.nextLong();
            //末尾有1个零
            long start = 5;
            //末尾有10^18个零
            long end = 4000000000000000020L;
            //二分查找法
            while (start <= end) {
                long mid = start + ((end - start) >> 1);
                long midRes = trailingZeroes(mid);
                if (midRes > k) {
                    end = mid - 1;
                } else if (midRes < k) {
                    start = mid + 1;
                } else {
                    while (mid % 5 != 0) {
                        mid--;
                    }
                    System.out.println(mid);
                    return;
                }
            }
            System.out.println(-1);
        }
    }

    public static long trailingZeroes(long n) {
        long res = 0;
        n /= 5;
        while (n > 0) {
            res += n;
            n /= 5;
        }
        return res;
    }

}

原文链接:https://blog.csdn.net/m0_52440465/article/details/124060160

你可能感兴趣的:(蓝桥杯,蓝桥杯)