求阶乘(蓝桥杯)JAVA

问题描述:

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

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

输入格式:

一个整数K。

输出格式:

一个整数代表答案。

输入样例:

样例输出:

10 

评测用例规模与约定:

对于30%的数据,1<=K<=10^6

对于100%的数据,1<=K<=10^18

 时间限制:

时间限制: 1.0s 内存限制: 512.0MB 

解题思路:

值得注意K值10^18是比int的范围要大,long的范围刚好。

显然求n!的阶层再数末尾0是可以排除了数据太大了,那么最优解题思路的核心思想的原理来自于上一篇文章:阶层末尾零的个数

还有就是一位大哥的二分查找思想对我颇有震撼。

唯一的缺点就是要知道10^18所对应的阶层值。

理论成立代码如下

import java.util.Scanner;

public class Main {
 public static void main(String[] args) {
	    Scanner sc = new Scanner(System.in);
	    long k = sc.nextLong();
        long left = 5;//一个零
        long right = 4000000000000000020L;//10^18个0
        while(left <= right)//二分查找
        {
             long middle = ((right - left) >> 1) + left;//防止超出long的范围。>>1高效除以二
             long zeronumber = zero(middle);
             if(zeronumber > k)
             {
                right = middle - 1; 	 
             }
             else if(zeronumber < k)
             {
                    left = middle + 1;            	 
             }
             else
             {
            	while(middle%5 != 0)//防止得到的middle不是最小值
            	{
            	      middle--;
            	}
            	System.out.print(middle);
                return;
             }
              
        }
        System.out.print(-1);
}
 public static  long zero(long n)//核心思想不变
 {
   long number = 0;
   while(n > 0)
   {
	    n = n/5;
	    number = number + n;
   }
   return number;
 }
}

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值