华为OJ——整数与IP地址间的转换

来源:互联网 发布:mysql pdf 微盘 编辑:程序博客网 时间:2024/06/05 08:53

题目描述

  • 原理:

       ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数。

  • 举例:

       一个ip地址为10.0.3.193

每段数字 相对应的二进制数 10 00001010 0 00000000 3 00000011 193 11000001

       组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

       ip的每段可以看成是一个0-255的整数,需要对IP地址进行校验

  • 输入描述:

    输入
    1 输入IP地址
    2 输入10进制型的IP地址

  • 输出描述:

    输出
    1 输出转换成10进制的IP地址
    2 输出转换后的IP地址

  • 示例1

    输入
    10.0.3.193
    167969729
    输出
    167773121
    10.3.3.193

实现代码:

package cn.c_shuang.demo33;import java.util.Scanner;/** * 整数与IP地址间的转换 * @author Cshuang * */public class Main {    public static void main(String[] args) {        Scanner in =new Scanner(System.in);        while(in.hasNext()){            String ipStr=in.nextLine();            String longStr=in.nextLine();            System.out.println(ipToLong(ipStr));            System.out.println(longToIP(longStr));        }        in.close();    }    private static long ipToLong(String ipStr) {        String[] ips=ipStr.split("\\.");        StringBuilder sb=new StringBuilder();        for (int i = 0; i < ips.length; i++) {            String ipIntStr=Integer.toBinaryString(Integer.parseInt(ips[i]));            if(ipIntStr.length()<8){                while(ipIntStr.length()!=8)                    ipIntStr="0"+ipIntStr;            }            sb.append(ipIntStr);        }        return Long.valueOf(sb.toString(),2);    }    private static String longToIP(String longStr) {        String bins=Long.toBinaryString(Long.parseLong(longStr));//注意这里必须用Long.parseLong()进行接收转换,否则会超出范围        StringBuilder sb=new StringBuilder();        String s;        int n;        while(bins.length()>0) {            if(bins.length()%8!=0){//有可能恰好是32位,此时取余为0                s=bins.substring(0,bins.length()%8);                bins=bins.substring(bins.length()%8);            }else{                s=bins.substring(0,8);                bins=bins.substring(8);            }            n=Integer.parseInt(s, 2);            if(bins.length()!=0){                sb.append(n+".");            }else                sb.append(n);        }        return sb.toString();    }}
  • 注意:
    ①接收类型的确定,这里用的是long型,避免出现内存泄漏;
    ②进制之间的转换以及细节
原创粉丝点击