当前位置: 首页 > article >正文

【华为OD机试】1035 - 判断两个IP是否属于同一子网

文章目录

    • 一、题目
      • 🔸题目描述
      • 🔸输入输出
      • 🔸样例1
    • 二、思路解析
    • 三、代码参考
  • 作者:KJ.JK


🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
 
🍂个人博客首页: KJ.JK
 
💖系列专栏:华为OD机试(Java&Python&C语言)

一、题目


🔸题目描述

IP地址是由4个0-255之间的整数构成的,用"."符号相连。
二进制的IP地址格式有32位,例如:10000011,01101011,00000011,00011000;每八位用十进制表示就是131.107.3.24
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
子网掩码与IP地址结构相同,是32位二进制数,由1和0组成,且1和0分别连续,其中网络号部分全为“1”和主机号部分全为“0”。
你可以简单的认为子网掩码是一串连续的1和一串连续的0拼接而成的32位二进制数,左边部分都是1,右边部分都是0。
利用子网掩码可以判断两台主机是否在同一子网中。
若两台主机的IP地址分别与它们的子网掩码进行逻辑“与”运算(按位与/AND)后的结果相同,则说明这两台主机在同一子网中。
 
示例1:
I P 地址  192.168.0.1
子网掩码  255.255.255.0
转化为二进制进行运算:
I P 地址  11000000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算 11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
 
示例2:
I P 地址  192.168.0.254
子网掩码  255.255.255.0
转化为二进制进行运算:
I P 地址 11000000.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. 掩码与IP每一段在 0 - 255 之间
 2. 掩码的二进制字符串前缀为网络号,都由‘1’组成;后缀为主机号,都由’0’组成


🔸输入输出

输入
3行输入,第1行是输入子网掩码、第2,3行是输入两个ip地址
题目的示例中给出了三组数据,但是在实际提交时,你的程序可以只处理一组数据(3行)
 
输出
若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2


🔸样例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
255.255.255.0
192.168.0.254
192.168.0.1


输出
1
2
0


说明:
对于第一个例子:
255.255.255.0
192.168.224.256
192.168.10.4
其中IP:192.168.224.256不合法,输出1

对于第二个例子:
255.0.0.0
193.194.202.15
232.43.7.59
2个与运算之后,不在同一个子网,输出2

对于第三个例子,2个与运算之后,如题目描述所示,在同一个子网,输出0

二、思路解析

首先本题中包括两个目标,一个是判断ip地址及掩码是否规范 第二个是判断两个ip地址是否属于同一子网 对于判断是否规范问题,首先题目中给出了要求: 1、掩码与IP每一段在0-255之间 2、掩码的二进制字符串,前缀全为1,后缀全为0 直接按照字面意思判断即可 对于判断是否属于同一子网,我们可以将ip地址转换成二进制字符串,通过字符串的比较进行判断
在这里插入图片描述


三、代码参考

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String mask = sc.nextLine();
            String ip1 = sc.nextLine();
            String ip2 = sc.nextLine();
            String[] _mask = mask.split("\\.");
            String[] iip1 = ip1.split("\\.");
            String[] iip2 = ip2.split("\\.");
            StringBuilder mask_sb = new StringBuilder();
            StringBuilder ip1_sb = new StringBuilder();
            StringBuilder ip2_sb = new StringBuilder();
            boolean flag = true;  //判断是否有大于255的不规范
            for(int i=0; i<4; i++){
                int num = Integer.parseInt(_mask[i]);
                if(num>255 || num<0){
                    flag = false;
                    break;
                }
                String num2 = Integer.toBinaryString(num);
                while(num2.length()<8){
                    num2 = "0" + num2;
                }
                mask_sb.append(num2);

                num = Integer.parseInt(iip1[i]);
                if(num>255 || num<0){
                    flag = false;
                    break;
                }
                num2 = Integer.toBinaryString(num);
                while(num2.length()<8){
                    num2 = "0" + num2;
                }
                ip1_sb.append(num2);

                num = Integer.parseInt(iip2[i]);
                if(num>255 || num<0){
                    flag = false;
                    break;
                }
                num2 = Integer.toBinaryString(num);
                while(num2.length()<8){
                    num2 = "0" + num2;
                }
                ip2_sb.append(num2);
            }
            if(!flag){
                System.out.println(1);
                continue;
            }
            mask = mask_sb.toString();
            ip1 = ip1_sb.toString();
            ip2 = ip2_sb.toString();
            int left = 0, right = 31;
            while(mask.charAt(left)=='1'){
                left++;
            }
            while(mask.charAt(right)=='0'){
                right--;
            }
            if(left!=right+1){  //判断掩码是否规范
                System.out.println(1);
                continue;
            }

            boolean ans = true;
            for(int i=0; i<32 && mask.charAt(i)=='1'; i++){
                if(ip1.charAt(i) != ip2.charAt(i)){
                    ans = false;
                    break;
                }
            }

            if(ans){
                System.out.println(0);
            }else{
                System.out.println(2);
            }
        }
    }
}





--------------------------------------------------------

while True:
    try:
        x=input().split(".")
        y=input().split(".")
        z=input().split(".")
        m=[]
        n=[]
        for i in range (len(x)):
            x[i]=int(x[i])
            y[i] = int(y[i])
            z[i] = int(z[i])
        if x[0]!=255 or x[3]!=0 or max(x+y+z)>255 or min(x+y+z)<0:
            print("1")
        else:
            for i in range (len(x)):
                x[i]=bin(x[i]).replace("0b","")
                y[i] = bin(y[i]).replace("0b","")
                z[i] = bin(z[i]).replace("0b","")
                m.append(int(x[i],2)&int(y[i],2))
                #m[i]=m[i].replace("0b","")
                n.append(int(x[i],2)&int(z[i],2))
                #n[i] = n[i].replace("0b", "")
            if m==n:
                print("0")
            else:
                print("2")
    except:
        break





--------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int g_ip[3][4]; /* 3 按顺序表示掩码,两个子设备 */
int main(int argc, char** argv)
{
    // freopen("input.txt", "r", stdin);
    int i, j;
    while (scanf("%d.%d.%d.%d", &g_ip[0][0], &g_ip[0][1], &g_ip[0][2], &g_ip[0][3]) != EOF) {
        scanf("%d.%d.%d.%d", &g_ip[1][0], &g_ip[1][1], &g_ip[1][2], &g_ip[1][3]);
        scanf("%d.%d.%d.%d", &g_ip[2][0], &g_ip[2][1], &g_ip[2][2], &g_ip[2][3]);

        for (i = 0; i < 3; i++) { /* 保证数值均在 0-255 */
            for (j = 0; j < 4; j++) if ((g_ip[i][j] < 0) || (g_ip[i][j] > 255)) break;
            if (j < 4) break;
        }
        if (i < 3) { printf("1\n"); continue; }

        for (i = 0; i < 4; i++) { /* 保证掩码是左 1 右 0 的标准格式 */
            if (g_ip[0][i] == 255) continue;
            for (j = i + 1; j < 4; j++) if (g_ip[0][j] != 0) break;
            if (j < 4) break;
            if ((g_ip[0][i] != 254) && (g_ip[0][i] != 252) && (g_ip[0][i] != 248) && (g_ip[0][i] != 240) &&
                (g_ip[0][i] != 224) && (g_ip[0][i] != 192) && (g_ip[0][i] != 128) && (g_ip[0][i] != 0)) break;
        }
        if (i < 4) { printf("1\n"); continue; }

        for (i = 0; i < 4; i++) { /* 匹配是否同一网络 */
            if ((g_ip[1][i] & g_ip[0][i]) != (g_ip[2][i] & g_ip[0][i])) break;
        }
        if (i < 4) printf("2\n"); else printf("0\n");
    }
    // fclose(stdin);

    return 0;
}

}




请添加图片描述


作者:KJ.JK

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习


http://www.kler.cn/a/9410.html

相关文章:

  • 闯关leetcode——3174. Clear Digits
  • 编译ffmpeg动态库时设置RPATH为$ORIGIN
  • 工业相机选取
  • docker运行ActiveMQ-Artemis
  • 量化交易系统开发-实时行情自动化交易-3.4.2.Okex行情交易数据
  • uni-app表单⑪
  • OpenText Content Server 客户案例——全球最大的商业炸药和创新爆破系统供应商Orica
  • 数据结构exp1_2学生成绩排序
  • MySQL库的操作
  • 博瑞智能云音箱云喇叭API开发定时播报文档(2023-4-5)
  • Linux进程间通信
  • 计讯物联小型水库雨水情测报与大坝安全监测一体化解决方案,确保水库安全运行
  • SpringAMQP
  • 数字化转型的避坑指南:细说数字化转型十二大坑
  • 实验6 TensorFlow基础
  • 亚马逊测评只能下单上好评?卖家倾向养号测评还有这些骚操作
  • Drone+Gitea CICD环境搭建流程笔记
  • Git(四):远程仓库的搭建、获取与更新
  • redis基础总结-常用命令
  • 初识C语言 ——“C Primer Plus”
  • TOGAF—架构治理
  • leaflet使用L.geoJSON加载文件,参数onEachFeature的使用方法(129)
  • git常用命令
  • 【前端】VUE3去掉控制台的warn信息
  • redis set list
  • 一天吃透计算机网络八股文