首页 > 解决方案 > Java 数据类型 - 黑客排名

问题描述

我正在尝试解决有关黑客等级的问题,所以我必须在此处列出我必须做的事情(代码解释),并且我已经设法使代码运行和工作,但它没有通过 2 次测试。在此处输入图像描述

这是我的代码。

import java.util.Scanner;

public class JavaDatatypes {
    public static void main(String[] argh) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 0; i < t; i++) {
            try {
                long x = sc.nextLong();
                System.out.println(x + " can be fitted in:");

                int[] bits = {8, 16, 32, 64};
                String[] strings = {"byte", "short", "int", "long"};
                for (int j = 0; j < bits.length; j++) {
                    long range = (long) (Math.pow(2, bits[j] - 1));
                    if (x >= -range && x <= range -1) {
                        System.out.println("* " + strings[j]);
                    }
                }
                //Complete the code
            } catch (Exception e) {
                System.out.println(sc.next() + " can't be fitted anywhere.");
            }
        }
    }
}

我查看了预期的输出,它预计9223372036854775807会输出很长,而我的代码没有输出很长,我不知道为什么。

标签: javatypes

解决方案


只需省略对 64 位和long.

如果long x = sc.nextLong();成功无一例外,您已经知道该数字适合该long类型。因此,如果您没有遇到异常,您始终可以打印“* long”。

关于使用的一个评论Math.pow():它基于浮点运算,因此,它可能涉及小的舍入误差。2 的幂可以通过位移来计算,所以

long range = (long) (Math.pow(2, bits[j] - 1))

可以替换为

long range = 2L << (bits[j] - 1)

这给出了准确的结果,也比Math.pow().


推荐阅读