题解 | #整数与IP地址间的转换#

整数与IP地址间的转换

https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String ipStr = in.nextLine(); // 保存输入的点分十进制地址
        String decimalIpStr = in.nextLine(); // 保存输入的十进制整数
        // 1. 点分十进制转换成 十进制整数
        String[] ipStrs = ipStr.split("\\.");
        StringBuilder midRes = new StringBuilder();
        for (String str : ipStrs) {
            // 将各段的十进制转换成二进制 并拼接起来
            midRes.append(decToBin(str, 8));
        }
//        System.out.println(midRes);
        long res1 = getDecRes(midRes);
        // 2. 十进制整数转换成点分二进制
        StringBuilder originalBinStr = decToBin(decimalIpStr, 32);
//        System.out.println(originalBinStr);
        // 分段 然后分段转成 十进制
        char[] chars = originalBinStr.toString().toCharArray();
        StringBuilder midRes2 = new StringBuilder();
        StringBuilder res2 = new StringBuilder();
        for (int i = 0; i < chars.length; i++) {
            midRes2.append(chars[i]);
            if (midRes2.length() % 8 == 0) {
                res2.append(getDecRes(midRes2));
                res2.append(".");
                midRes2.replace(0, midRes2.length(), ""); // 注意是包头不包尾
            }
        }
        res2.replace(res2.length() - 1, res2.length(), ""); // 删掉最后的.
        System.out.println(res1);
        System.out.println(res2);
    }

    /**
     * 获得二进制对应的十进制整数
     * @param midRes
     * @return
     */
    private static long getDecRes(StringBuilder midRes) {
        char[] charArray = midRes.toString().toCharArray();
        int len = charArray.length;
        long res1 = 0;
        for (int i = 0; i < len; i++) {
            res1 += Long.parseLong(String.valueOf(charArray[i])) * Math.pow(2, len - 1 - i);
        }
        return res1;
    }

    /**
     * 将各段的十进制转换成二进制
     * @param str 要转换的十进制字符串
     * @param num 期望转成的二进制位数
     * @return
     */
    private static StringBuilder decToBin(String str, int num) {
        long dec = Long.parseLong(str);
        // 十进制转二进制 除以2 倒取余, 终止条件:商为 1
        long[] reminders = new long[num]; // 存取计算过程中的余数
        long quotient = dec; // 表示计算过程中的商(被除数)
        int base = 2; // 表示要转换成的进制
        int i = 0; // 计算的次数
        while (quotient != 1) {
            reminders[i] = quotient % base;
            quotient = quotient / base;
            i++;
        }
        StringBuilder binStr = new StringBuilder();
        binStr.append(1); // 拼接最后的商 1
        for (int j = i - 1; j >= 0; j--) {
            binStr.append(reminders[j]);
        }
        StringBuilder appendStr = new StringBuilder();
        if (binStr.length() < num) {
            int k = num - binStr.length(); // 要填充的 0 个数
            for (int l = 0; l < k; l++) {
                appendStr.append("0");
            }
        }
        return appendStr.append(binStr);
    }
}

注意事项:

  1. 需要注意数据的范围 Integer.parseInt() 转换成的是有符号整数。Parses the string argument as a signed integer in the radix specified by the second argument.

public static int parseInt(String s, int radix)

throws NumberFormatException

{ …… }

  1. 对进制转换要足够熟悉

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务