华为机试HJ39 判断两个IP是否属于同一子网

news2024/11/14 5:24:26

首先看一下题

描述

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)后的结果相同,则说明这两台主机在同一子网中。

示例:
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

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

一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.首先介绍了IP地址,是由4个0-255之间的整数构成的,用“.”符号相连

2.二进制的IP地址格式有32位(32个二进制位组成一个IP地址)

3.每八位可以用十进制表示(将四组8位二进制转换成4组10进制数字,用‘.’分隔开)

4.子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。

5.子网掩码与IP地址结构相同,是32位二进制数,由1和0组成,且1和0分别连续

6.其中网络号部分全为“1”和主机号部分全为“0”

7.你可以简单的认为子网掩码是一串连续的1和一串连续的0拼接而成的32位二进制数,左边部分都是1,右边部分都是0.

8.利用子网掩码可以判断两台主机是否在同一子网中。

9.若两台主机的IP地址分别与它们的子网掩码进行逻辑“与”运算(按位与/AND)后的结果相同,则说明这两台主机在同一子网中。

10.输入一个子网掩码以及两个ip地址,判断这两个ip地址是否是一个子网络。

11.若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2.

12.注:有效掩码与IP的性质为:(1)掩码与IP每一段在0-255之间

(2)掩码的二进制字符串前缀为网络号,都由‘1’组成;后缀为主机号,都由‘0’组成

13.输入描述:3行输入,第1行是输入子网掩码、第2,3行是输入两个ip地址

题目的示例中给出了三组数据,但是在实际提交时,你的程序可以只处理一组数据(3行)。

14.输出描述:若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2

二、解题思路

1.首先,输入是三行数据,第一行是子网掩码,第二三行是两个IP地址

2.我们先判断格式,如果格式不对直接输出1

3.判断的时候注意子网掩码必须前面全是1后面全是0

4.掩码和IP的四组十进制数字范围都在0-255之间

5.如果合法,我们对两个IP和子网掩码进行逻辑与处理

6.如果逻辑与处理之后的两个IP相同那么我们输出0,不同我们输出2

三、具体步骤

使用的语言是C

#include <stdio.h>

int valid(int a) {
    if (a >= 0 && a <= 255) {
        return 1;
    }
    return 0;
}

int validip(int a, int b, int c, int d) {
    if (valid(a) && valid(b) && valid(c) && valid(d) ) {
        return 1;
    }
    return 0;
}

int main() {
    int s1, s2, s3, s4;
    while(scanf("%d.%d.%d.%d", &s1, &s2, &s3, &s4) != EOF) {
        int ip1_1, ip1_2, ip1_3, ip1_4, ip2_1, ip2_2, ip2_3, ip2_4;
        scanf("%d.%d.%d.%d", &ip1_1, &ip1_2, &ip1_3, &ip1_4);
        scanf("%d.%d.%d.%d", &ip2_1, &ip2_2, &ip2_3, &ip2_4);
        if (!validip(ip1_1, ip1_2, ip1_3, ip1_4)) {
            printf("1\n");
            continue;
        }
        else if (!validip(ip2_1, ip2_2, ip2_3, ip2_4)) {
            printf("1\n");
            continue;
        }
        else if (!validip(s1, s2, s3, s4)) {
            printf("1\n");
            continue;
        }
        // 还需要判断是否前缀全都是1
        unsigned int sub = 0;
        sub = (s1 << 24) + (s2 << 16) + (s3 << 8) + s4;
        int flag = 1;
        int notvalid = 0;
        for (int i = 31; i >= 0; i--) {
            // printf("the i is %d and the (sub >> i) & 1 is %d\n", i , (sub >> i) & 1);
            if (!((sub >> i) & 1)) {
                // printf("the %d i is 0\n", i);
                flag = 0;
            }
            if (flag == 0) {

                if ((sub >> i) & 1) {
                    // printf("the %d i is 1\n", i);
                    notvalid = 1;
                }
            }
        }
        if (notvalid) {
            printf("1\n");
            continue;
        }

        // 如果ip地址和子网掩码都合法,我们对ip地址进行与运算
        unsigned int ip1 = (ip1_1 << 24) + (ip1_2 << 16) + (ip1_3 << 8) + ip1_4;
        unsigned int ip2 = (ip2_1 << 24) + (ip2_2 << 16) + (ip2_3 << 8) + ip2_4;
        if((ip1 & sub) == (ip2 & sub)) {
            printf("0\n");
            continue;
        }
        printf("2\n");

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

scala 迭代更新

在Scala中&#xff0c;迭代器&#xff08;Iterator&#xff09;是一种用于遍历集合&#xff08;如数组、列表、集合等&#xff09;的元素而不暴露其底层表示的对象。迭代器提供了一种统一的方法来访问集合中的元素&#xff0c;而无需关心集合的具体实现。 在Scala中&#xff0c…

部署zabbix遇到问题: cannot find a valid baseurl for repo:centos-sclo-rh/x86 64 怎么解决 ?

安装 Zabbix 前端包&#xff0c;提示cannot find a valid baseurl for repo&#xff1a;centos-sclo-rh/x86 64 安装zabbix前端包 # yum install zabbix-web-mysql-scl zabbix-apache-conf-scl 解决办法&#xff1a; 原因是&#xff1a;CentOS7的SCL源在2024年6月30日停止维护…

SpringBoot(十九)创建多模块Springboot项目(完整版)

之前我有记录过一次SpringBoot多模块项目的搭建,但是那一次只是做了一个小小的测试。只是把各模块联通之后就结束了。 最近要增加业务开发,要将目前的单模块项目改成多模块项目,我就参照了一下我上次搭建的流程,发现总是有报错。上次搭建的比较顺利,很多细枝末节也没有仔细…

基于Python的智能无人超市管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

什么是量化交易

课程大纲 内容初级初识量化&#xff0c;理解量化 初识量化 传统量化和AI量化的区别 量化思想挖掘 量化思想的挖掘及积累技巧 量化代码基础&#xff1a; python、pandas、SQL基础语法 金融数据分析 常用金融分析方式 常用因子分析方式 数据分析实战练习 回测及交易引擎 交易引擎…

xcode-select: error: tool ‘xcodebuild‘ requires Xcode, but active developer

打开 .sh 文件所在的终端窗口&#xff0c;执行终端命令&#xff1a;sh 文件名.sh&#xff0c;出现如下错误&#xff1a; 解决办法&#xff1a;

PETR/PETRv2/StreamPETR论文阅读

1. PETR PETR网络结构如下&#xff0c;主要包括image-backbone&#xff0c;3D Coordinates Generator&#xff0c;3D Position Encoder&#xff0c;transformer Decoder四个模块。 把N 个视角的图像输入到骨干网络中以提取 2D 多视图特征。在 3D 坐标生成器中&#xff0c;首先…

除了 Postman,还有什么好用的 API 调试工具吗

尽管 Postman 拥有团队协作等实用特性&#xff0c;其免费版提供的功能相对有限&#xff0c;而付费版的定价可能对小团队或个人开发者而言显得偏高。此外&#xff0c;Postman 的访问速度有时较慢&#xff0c;这可能严重影响使用体验。 鉴于这些限制&#xff0c;Apifox 成为了一…

程序员做自媒体,你所不了解的提词器,原来还有这么多大用处

程序猿的出路&#xff0c;不只是外卖员&#xff01; 你或许以为提词器只是个“背词神器”&#xff1f;实际上&#xff0c;它的应用范围早已超出你的想象。从直播到会议&#xff0c;从视频拍摄到户外采访&#xff0c;每一种场景都有对应的提词神器&#xff0c;帮你提升效率、避…

DeBiFormer实战:使用DeBiFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

JS 实现WebSocket通讯和什么是WebSocket

WebSocket 介绍&#xff1a; WebSocket 是一种网络传输协议&#xff0c;可在单个 TCP 连接上进行全双工通信。它允许服务器主动向客户端推送信息&#xff0c;客户端也能实时接收服务器的响应。 客户端 这里实现了将input内的内容发送给客户端&#xff0c;并将接收到的服务器的…

前端 JS面向对象 继承

目录 一、ES5通过prototype来继承 二、ES6 class实现 一、ES5通过prototype来继承 const Person{eyes:2,head:1}function Woman(){}Woman.prototypePersonconst ladynew Woman()console.log(lady)function Man(){}Man.prototypePersonconst mannew Man()console.log(man) 打…

三菱FX5UPLC以太网Socket通信功能Passive开放的程序示例

Passive开放的通信流程如下所示。 参数设置 示例程序中使用的参数设置如下所示。 [CPU模块】 导航窗口↔[参数]↔[模块型号]↔[模块参数]-[以太网端口]-[基本设置]-[对象设备连接配置设置]↔[详细设置]→[以太网配置(内置以太网端口)]画面 【以太网模块】 [导航]中「参数]→[模…

UniApp 应用、页面与组件的生命周期详解

UniApp 应用、页面与组件的生命周期详解 在uni-app中包含了 应用生命周期、页面生命周期、和组件生命周期&#xff08; Vue.js的&#xff09;函数。 应用生命周期 应用生命周期仅可在App.vue中监听&#xff0c;在其它页面监听无效。 <script>export default {onLaunc…

Optimism掀起发链热潮,还有哪些发链 平台值得关注?

继电子巨头索尼在OP上发布L2 Soneium之后&#xff0c;10月29日&#xff0c;再质押协议巨头Swell宣布迁移至Optimism超级链&#xff0c;通过OP Stack构建Rollup加入OP生态系统。据DeFilama数据显示&#xff0c;Swell的TVL最高曾超过30亿美元&#xff0c;目前为13.4亿美元&#x…

0. 0:《跟着小王学Python·新手》

《跟着小王学Python新手》系列 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌握Python的核心概念。通过开发游戏、构…

如何优化Kafka消费者的性能

要优化 Kafka 消费者性能&#xff0c;你可以考虑以下策略&#xff1a; 并行消费&#xff1a;通过增加消费者组中的消费者数量来并行处理更多的消息&#xff0c;从而提升消费速度。 批量消费&#xff1a;配置 fetch.min.bytes 和 fetch.max.wait.ms 参数来控制批量消费的大小和…

Golang | Leetcode Golang题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; func nextGreaterElement(n int) int {x, cnt : n, 1for ; x > 10 && x/10%10 > x%10; x / 10 {cnt}x / 10if x 0 {return -1}targetDigit : x % 10x2, cnt2 : n, 0for ; x2%10 < targetDigit; x2 / 10 {cnt2}x x2%10 -…

AscendC从入门到精通系列(一)初步感知AscendC

1 什么是AscendC Ascend C是CANN针对算子开发场景推出的编程语言&#xff0c;原生支持C和C标准规范&#xff0c;兼具开发效率和运行性能。基于Ascend C编写的算子程序&#xff0c;通过编译器编译和运行时调度&#xff0c;运行在昇腾AI处理器上。使用Ascend C&#xff0c;开发者…

unity基础,点乘叉乘。

简单记录下点乘叉乘&#xff0c;要不每次用完就忘&#xff0c;忘了又查。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class TestCrossDot : MonoBehaviour {/// <summary>/// 原点/// </summary>public Transform t…