题解 | #整数与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); } } }