二进制高低位交换の琐事(洛谷P1100题题解,Java语言描述)

题目要求

P1100题目链接

在这里插入图片描述

分析

要求其实还是比较明确的,就是给一个int数据,将其变成二进制表示(32位),前16位整体和后16位整体交换位置,内部不变,再将新的二进制数据重新变成数值输出。

这题特别恶心的就是这个重新生成的二进制数可能超出int范围,我们只能在最后parseLong()而不能parseInt()。

对于Java用户来讲,其实就是关于Integer类和Long类的使用问题。

java.lang.Integer类的这个方法对我们处理这个问题很有帮助:
public static String toBinaryString​(int i)
该方法传入一个int参数,转化成String类型的二进制字符串,但没有高位0。

java.lang.Long类的这个方法对我们处理这个问题很有帮助:
public static long parseLong​(String s, int radix)
该方法传入一个String参数,和一个表示进制的radix参数(这里肯定是要指定为2),将二进制字符串转换成long类型的数值。

其他的处理就需要其他类的辅助,比如String,比如StringBuilder……
具体的详见AC代码。

第一次提交——RE

在这里插入图片描述

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String num = Integer.toBinaryString(scanner.nextInt());
        int length = num.length();
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 32-length; i++) {
            builder.append("0");
        }
        num = builder.append(num).toString();
        num = num.substring(16) + num.substring(0, 16);
        int counter = 0;
        for (char c : num.toCharArray()) {
            if (c != '0') {
                break;
            }
            counter++;
        }
        num = num.substring(counter);
        System.out.println(Integer.parseInt(num, 2));
        scanner.close();
    }
}

获取了测试数据4:
in
65333513
out
3909682148

测试后发现是没考虑到导致以后超出了int的范围,应该换成long。

第二次提交——AC

在这里插入图片描述

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String num = Integer.toBinaryString(scanner.nextInt());
        int length = num.length();
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 32-length; i++) {
            builder.append("0");
        }
        num = builder.append(num).toString();
        num = num.substring(16) + num.substring(0, 16);
        int counter = 0;
        for (char c : num.toCharArray()) {
            if (c != '0') {
                break;
            }
            counter++;
        }
        num = num.substring(counter);
        System.out.println(Long.parseLong(num, 2));
        scanner.close();
    }
}
发布了369 篇原创文章 · 获赞 626 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104085428