描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
数据范围:保证输入的是合法的 IP 序列
输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址示例1
输入:
10.0.3.193 167969729复制输出:
167773121 10.3.3.193复制
package org.example.medium;
import java.util.Scanner;
import java.util.Stack;
public class Hj33 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String s = scanner.nextLine();
String s1 = scanner.nextLine();
Long sDeIp = deIp(s);
String sEnIp = enIp(s1);
System.out.println(sDeIp);
System.out.println(sEnIp);
}
}
private static Long deIp(String str) {
boolean flag = false;
int count = 0;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == '.') {
count++;
}
}
int len = count + 1;
StringBuilder sb = new StringBuilder();
int[] strs = new int[len];
int j = 0;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == '.') {
strs[j] = Integer.parseInt(sb.toString());
j++;
sb = new StringBuilder();
} else {
sb.append(c);
if (i == str.length() - 1) {
strs[j] = Integer.parseInt(sb.toString());
}
}
}
sb = new StringBuilder();
for (int i = 0; i < strs.length; i++) {
String s1 = Long.toBinaryString(strs[i]);
String s;
if (i != 0) {
s = turnZero(s1);
} else {
s = s1;
}
sb.append(s);
}
Long i = Long.parseLong(sb.toString(), 2);
return i;
}
public static String turnZero(String str) {
StringBuilder sb = new StringBuilder("");
if ("0".equals(str)) {
return "00000000";
} else {
int len = 8 - str.length();
while (len > 0) {
sb.append("0");
len--;
}
}
sb.append(str);
return sb.toString();
}
public static String enIp(String s) {
String str = Long.toBinaryString(Long.parseLong(s));
int count = 0;
Stack<String> strStack = new Stack<>();
StringBuilder sb = new StringBuilder();
for (int i = str.length() - 1; i >= 0; i--) {
char c = str.charAt(i);
if (count == 8) {
sb.reverse();
strStack.push(turnString(sb.toString()));
sb = new StringBuilder();
sb.append(c);
count = 1;
} else {
sb.append(c);
count++;
if (i == 0) {
strStack.push(turnString(sb.reverse().toString()));
}
}
}
sb = new StringBuilder();
while (!strStack.isEmpty()){
String pop = strStack.pop();
sb.append(pop);
sb.append(".");
}
sb.deleteCharAt(sb.length()-1);
return sb.toString();
}
public static String turnString(String str) {
long l = Long.parseLong(str, 2);
return String.valueOf(l);
}
}