题解 | #整数与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 scanner = new Scanner(System.in);
        while(scanner.hasNextLine()) {
            String firstLine = scanner.nextLine();
            String secondLine = scanner.nextLine();
            /**
             * ip地址转为10进制
             */
            String[] ips = firstLine.split("\\.");
            StringBuilder sbAll = new StringBuilder();
            for(int i = 0; i < ips.length; i ++)
            {
                int val = Integer.parseInt(ips[i]);
                StringBuilder sb = new StringBuilder();
                if(val == 0){
                    sb.append("0000");
                }else{
                    while(val != 0)
                    {
                        sb.append(val % 2);
                        val  = val / 2;
                    }
                }
                int length = sb.length();
                for(int j = 0; j < 8 - length; j ++)
                {
                    sb.append("0");
                }
                sb.reverse();
                sbAll.append(sb.toString());
            }
            long decimalVal = 0;
            /**
             * 请注意,base要设置为long类型,否则会有溢出
             */
            Long base = 1L;
            for(int i = sbAll.length() - 1; i >= 0; i --)
            {
                char ch = sbAll.charAt(i);
                if(ch == '1')
                {
                    decimalVal = decimalVal + base;
                }
                base = base * 2;
            }

            System.out.println(decimalVal);
            /**
             * 十进制转二进制,然后再转为ip地址
             */
            /**
             * 请注意,不要用Integer.parseInt(secondLine)方法直接转,可能会溢出报错
             */
            //Integer value = Integer.parseInt(secondLine);
            Long baseDecimal = 1L;
            Long value = 0L;
            for(int i = secondLine.length() - 1; i >= 0; i --)
            {
                /**
                 * 请注意,cuVal,baseDecial不要用int类型,只要有一个为int类型,那么结果就是int类型,可能计算出的值大于int类型的最大值,导致溢出,导致计算结果不正确
                 */
                Long cuVal = Long.parseLong(String.valueOf(secondLine.charAt(i)));
                value = value + cuVal * baseDecimal;
                baseDecimal = baseDecimal * 10;
            }
            StringBuilder binarySb = new StringBuilder();
            if(value == 0)
            {
                for(int i = 0; i < 32; i ++)
                {
                    binarySb.append("0");
                }
            }else{
                while(value != 0)
                {
                    binarySb.append(value % 2);
                    value  = value / 2;
                }
            }
            int length = binarySb.length();
            for(int j = 0; j < 32 - length; j ++)
            {
                binarySb.append("0");
            }
            binarySb.reverse();
            String str = binarySb.substring(0,8);
            long decimalVal1 = 0;
            int base1 = 1;
            for(int i = str.length() - 1; i >= 0; i --)
            {
                char ch = str.charAt(i);
                if(ch == '1')
                {
                    decimalVal1 = decimalVal1 + base1;
                }
                base1 = base1 * 2;
            }
            System.out.print(decimalVal1+".");

            str = binarySb.substring(8,16);
            decimalVal1 = 0;
             base1 = 1;
            for(int i = str.length() - 1; i >= 0; i --)
            {
                char ch = str.charAt(i);
                if(ch == '1')
                {
                    decimalVal1 = decimalVal1 + base1;
                }
                base1 = base1 * 2;
            }
            System.out.print(decimalVal1+".");

            str = binarySb.substring(16,24);
            decimalVal1 = 0;
            base1 = 1;
            for(int i = str.length() - 1; i >= 0; i --)
            {
                char ch = str.charAt(i);
                if(ch == '1')
                {
                    decimalVal1 = decimalVal1 + base1;
                }
                base1 = base1 * 2;
            }
            System.out.print(decimalVal1+".");

            str = binarySb.substring(24,32);
            decimalVal1 = 0;
            base1 = 1;
            for(int i = str.length() - 1; i >= 0; i --)
            {
                char ch = str.charAt(i);
                if(ch == '1')
                {
                    decimalVal1 = decimalVal1 + base1;
                }
                base1 = base1 * 2;
            }
            System.out.print(decimalVal1);
        }
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 11:33
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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