Enndme· 2024-03-15 13:01 采纳率: 70%
浏览 8
已结题

为什么这段代码运行不出结果呢

为什么这段代码运行不出结果呢,哪里有问题

package NOJ;

import java.util.Scanner;

public class Test2052 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long l = 1, r = Long.MAX_VALUE - 5;
        long k = sc.nextLong();
        while (l < r) {
            long mid = l + r + 1 >> 1;
            if (check(mid) >= k)
                r = mid;
            else
                l = mid + 1;
        }
        if (check(l) == k)
            System.out.println(l);
        else
            System.out.println(-1);
    }

    private static long check(long num) {
        long res = 0;
        while (num > 0) {
            res += num / 5;
            num /= 5;
        }
        return res;
    }
}


  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-15 13:02
    关注

    引自免费微信小程序:皆我百晓生

    这段Java代码实现了一个求解特定问题的程序,但是你没有提供输入样例和期望输出,也没有明确说明代码要解决的具体问题是什么。从现有代码来看,它似乎在寻找一个满足特定条件的整数 l,这个条件与 check 函数相关联。

    main 方法中初始化了两个长整型变量 lr,并用二分搜索算法来找到一个满足 check(mid) 大于等于给定值 k 的最小整数 mid。当找到符合条件的数时,直接输出;否则输出 -1

    check 函数接收一个长整型参数 num,计算将 num 不断除以5并累加商的结果,直到 num <= 0。这个过程暗示着它可能是在统计 num 能够被连续除以5的次数。

    现在分析为何代码可能运行不出结果:

    1. 输入错误:请确保你的输入是通过标准输入(如控制台)正确传入的,并且输入数据类型和格式与 sc.nextLong() 匹配。

    2. 逻辑错误:二分搜索循环的条件判断及更新部分可能存在逻辑错误。正确的更新应该是:

      while (l < r) {
          long mid = l + r >> 1; // 应该是 l + r >> 1,而不是 l + r + 1 >> 1
          if (check(mid) >= k)
              r = mid - 1; // 当 check(mid) >= k 时,应将右边界调整为 mid - 1
          else
              l = mid + 1;
      }
      

      这里修正了二分搜索的区间更新,使得搜索范围逐步缩小至目标值附近。

    3. 极端情况处理:考虑 k 值过大或过小的情况,可能导致找不到符合条件的 l,总是输出 -1

    4. check 函数的逻辑是否符合预期:根据您的具体问题需求,检查 check 函数计算逻辑是否正确。如果问题描述与当前函数实现不符,则需要修改 check 函数。

    综上所述,请首先确认输入正确无误,并根据实际问题对上述疑点进行排查。若问题依然存在,请提供更多关于问题背景和期望输出的信息,以便更准确地定位问题所在。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月24日
  • 已采纳回答 3月16日
  • 创建了问题 3月15日