华为-判断两个IP是否属于同一子网

(java实现)


问题

题目描述:
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。
示例:
I P 地址  192.168.0.1
子网掩码  255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
I P 地址  192.168.0.254
子网掩码  255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。
输入一个子网掩码以及两个ip地址,判断这两个ip地址是否是一个子网络。
若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2。
输入描述:
输入子网掩码、两个ip地址
输出描述:
得到计算结果
示例1:

输入

255.255.255.0
192.168.224.256
192.168.10.4
255.0.0.0
193.194.202.15
232.43.7.59

输出

1
2

问题分析:

1、先判断子网掩码是否合法;
2、再判断输入的IP是否合法;
3、在子网掩码的位数下,比较两个IP二进制是否相同;
注意:在将整数转为二进制字符串时,要考虑补齐够8位数

相关知识:

1、将整数转为二进制字符串:int tmp = Integer.toBinaryString(re); //转为二进制
2、将IP内的数分离出来,“.”为特殊字符,需要用双反斜杠“\”: String[] str = s.split("\."); //传入IP地址,并将其拆分为多个数;
其次使用函数,将字符串转为整数: int re = Integer.parseInt(str[i]);

算法实现:

参考代码:

import java.util.*;
 
public class Main {
         
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        while (input.hasNext())
        {
            String s0 = input.nextLine();
            String s01 = input.nextLine();
            String s02 = input.nextLine();
             
            String res = intToStr(s0);
            String res1 = intToStr(s01);
            String res2 = intToStr(s02);
            if (res.equals("false") || res1.equals("false") || res2.equals("false"))
            {
                System.out.println("1");    //非法
                continue;
            }
            //统计子网掩码 1 的个数
            char[] ch = res.toCharArray();
            int count = 0;
            for (int i=0; i<ch.length; i++)
            {
                if (ch[i]=='1')
                {
                    count++;
                }
                else{
                    break;
                }
            }
            boolean flag = true;
            for (int i=count; i<ch.length; i++)
            {
                if (ch[i]=='1')
                {
                    flag = false;
                    break;
                }
            }
            if (!flag)
            {
                System.out.println("1");    //检测子网掩码非法,得是:网络号部分全为“1”和主机号部分全为“0”
                continue;
            }
             
            char[] ch1 = res1.toCharArray();
            char[] ch2 = res2.toCharArray();
            int ni = 0;
            for(; ni<count; ni++)
            {
                if (ch1[ni]!=ch2[ni]) //比较两个子网掩码
                {
                    break;
                }
            }
            if (count == ni)
            {
                System.out.println("0");
            }else
            {
                System.out.println("2");
            }
        }
    }
     
    public static String intToStr(String s)
    {
        String[] str = s.split("\\.");  //传入IP地址,并将其拆分。 String[] str = s.split(".");   \.
        String res = "",tmp,t;
        for (int i=0; i<str.length; i++)
        {
            int re = Integer.parseInt(str[i]);   
            //System.out.print(Integer.toBinaryString(re) + " ");
            if (re>=0 && re<=255)
            {
                tmp = Integer.toBinaryString(re);    //转为二进制
                补齐8位数
                t = "";
                for (int j=0; j<8-tmp.length(); j++)
                {
                    t += "0";
                }
                res = res + t + tmp;
            }
            else
                return "false";  //非法
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/u012449521/article/details/114227697