[华为机试练习题]54.判断任意两台计算机的IP地址是否属于同一子网络

题目

描述:

子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。就这么简单。

请看以下示例:
运算演示之一:

IP地址:192.168.0.1
子网掩码:255.255.255.0
AND运算
转化为二进制进行运算:
IP地址:11010000.10101000.00000000.00000001
子网掩码:11111111.11111111.11111111.00000000
AND运算:11010000.10101000.00000000.00000000
转化为十进制后为: 192.168.0.0

运算演示之二:

IP地址:192.168.0.254
子网掩码:255.255.255.0
AND运算
转化为二进制进行运算:
IP地址:11010000.10101000.00000000.11111110
子网掩码:11111111.11111111.11111111.00000000
AND运算:11010000.10101000.00000000.00000000
转化为十进制后为:192.168.0.0

通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。

接口说明
原型:

int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask);

输入参数:

char * pcIP1: 计算机1的IP地址,格式:“192.168.0.254”
char * pcIP2: 计算机2的IP地址,格式:“192.168.0.1”
char * pcSubNetworkMask: 子网掩码,格式:“255.255.255.0”

返回值:

0:IP1与IP2不属于同一子网络。
1:IP1与IP2属于同一子网络。

练习阶段:

初级

代码

/*---------------------------------------
*   日期:2015-07-05
*   作者:SJF0115
*   题目:判断任意两台计算机的IP地址是否属于同一子网络
*   来源:华为机试练习题
-----------------------------------------*/
#include <iostream>
#include "OJ.h"
#include <string>
#include <vector>
using namespace std;

/*
功能: 判断两台计算机IP地址是同一子网络。
原型:
    int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask);

输入参数:
    char * pcIP1: 计算机1的IP地址,格式:“192.168.0.254”;
    char * pcIP2: 计算机2的IP地址,格式:“192.168.0.1”;
    char * pcSubNetworkMask: 子网掩码,格式:“255.255.255.0”;

返回值:
    0:IP1与IP2不属于同一子网络;
    1:IP1与IP2属于同一子网络;
*/

// 检查子网掩码和IP格式是否正确 并返回分段
bool CheckIP(string str,vector<int> &numVec){
    int size = str.size();
    int pointCount = 0;
    string::size_type index = 0;
    int prePoint = 0;
    vector<string> part;
    while((index = str.find_first_of('.',index)) != string::npos){
        //..之间有数字
        if(index > prePoint){
            part.push_back(str.substr(prePoint,index-prePoint));
        }//if
        ++index;
        prePoint = index;
        ++pointCount;
    }//while
    if(prePoint < size){
        part.push_back(str.substr(prePoint));
    }//if

    int partSize = part.size();
    if(partSize != 4){
        return false;
    }//if

    // 判断每一部分均属于0-255
    int num;
    for(int i = 0;i < partSize;++i){
        num = atoi(part[i].c_str());
        numVec.push_back(num);
        if(num < 0 || num > 255){
            return false;
        }//if
    }//for
    // 代表错误IP
    if(pointCount != 3){
        return false;
    }//if
    return true;
}

int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask){
    if(pcIp1 == NULL || pcIp2 == NULL || pcSubNetworkMask == NULL){
        return 0;
    }//if
    // 转换为string (自己习惯)
    string ip1(pcIp1);
    string ip2(pcIp2);
    string net(pcSubNetworkMask);
    vector<int> ip1Vec;
    vector<int> ip2Vec;
    vector<int> netVec;
    int result,result2;
    // ip 子网掩码 输入合法
    if(CheckIP(ip1,ip1Vec) && CheckIP(ip2,ip2Vec) && CheckIP(net,netVec)){
        for(int i = 0;i < 4;++i){
            result = ip1Vec[i] & netVec[i];
            result2 = ip2Vec[i] & netVec[i];
            if(result != result2){
                return 0;
            }//if
        }//for
    }//if
    else{
        return 0;
    }//else
    return 1;
}
时间: 2024-08-22 14:15:37

[华为机试练习题]54.判断任意两台计算机的IP地址是否属于同一子网络的相关文章

[华为机试练习题]33.二叉搜索树

题目 描述: 判断两序列是否为同一二叉搜索树序列 题目类别: 树 难度: 中级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出: 如果序列相同则输出YES

[华为机试练习题]40.求车速

题目 描述: 一辆以固定速度行驶的汽车,司机在上午10点看到里程表(里程表有6位)上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的,例如95859公里).两小时后里程表上出现了一个新的对称数.问该车的速度(公里/小时)是多少? 接口说明 原型: int CalcSpeedOfCar(int iCurrentMileage, int * piCarSpeed); 输入参数: int pcCurrentMileage:当前里程数(为对称数) (pcCurrentMileage ≤ 9

[华为机试练习题]29.Arrange an Array to Form a Smallest Digit

题目 描述: Question: Input an array of positive integers, arrange the integers to form new digits, and output the smallest digit among all the new ones. Input Example 1: {2, 1} Output Example 1: 12 Input Example 2: {32, 321} Output Example 2: 32132 Input

[华为机试练习题]34.识别有效的IP地址和掩码并进行分类统计

题目 描述: 请解析IP地址和对应的掩码,进行分类识别.要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类. 所有的IP地址划分为 A,B,C,D,E五类 A类地址1.0.0.0~126.255.255.255; B类地址128.0.0.0~191.255.255.255; C类地址192.0.0.0~223.255.255.255; D类地址224.0.0.0~239.255.255.255: E类地址240.0.0.0~255.255.255.255 私网IP范围是: 10.0

[华为机试练习题]35.找零钱

题目 描述: 我们知道人民币有1.2.5.10.20.50.100这几种面值.现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种.比如4元,能用4张1元.2张1元和1张2元.2张2元,三种表示方法. 题目类别: 循环 难度: 初级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 输入有多组,每组一行,为一个整合n.输入以0结束. 输出: 输出该面额有几种表示方法. 样例输入: 1 4 0 样例输出: 1 3 思路 找

[华为机试练习题]25.圆桌游戏

题目 描述: 详细描述: N个人围坐在一个圆桌上,顺时针报数,报数的初始值为第一个人设置.当有成员报出的数字为7的倍数或数字中包含7,则该人退出圆桌,而后由下一个人开始重新继续该游戏. 实现以下接口: 1.设定输入原始的圆桌游戏的人数.以最先开始报数的人编号为1,顺时针排序. 2.设定第一个人的初始值,获取按照规则退出圆桌的人的编号. 3.结束游戏. 样例: 比如初始化为4人的游戏:第1轮初始值为1,退出为3:第2轮初始值为4,退出为4号:第三轮初始值为16,退出为2号:第四轮初始值为6,退出为

[华为机试练习题]32.数字基root

题目 描述: 求整数的Root:给定正整数,求每位数字之和;如果和不是一位数,则重复; 题目类别: 数组 难度: 初级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 输入任意一个或多个整数 输出: 输出各位数字之和,直到和为个位数为止(输入异常,则返回-1) 多行,每行对应一个输入数据的结果. 样例输入: 25 865 样例输出: 7 1 代码 /*--------------------------------------- * 日期:2015-07-0

[华为机试练习题]60.水仙花数

题目 描述: 水仙花数又称阿姆斯特朗数. 水仙花数是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身.(例如:1^3 + 5^3 + 3^3 = 153) 求输入的数字是否为水仙花数 练习阶段: 初级 代码 /*--------------------------------------- * 日期:2015-07-05 * 作者:SJF0115 * 题目:水仙花数 * 来源:华为机试练习题 ----------------------------------------

[华为机试练习题]38.名字的漂亮度

题目 描述: 给出一个名字,该名字有26个字符串组成,定义这个字符串的"漂亮度"是其所有字母"漂亮度"的总和. 每个字母都有一个"漂亮度",范围在1到26之间.没有任何两个字母拥有相同的"漂亮度".字母忽略大小写. 给出多个名字,计算每个名字最大可能的"漂亮度". 题目类别: 字符串 难度: 初级 运行时间限制: 无限制 内存限制: 无限制 阶段: 入职前练习 输入: 整数N,后续N个名字 N个字符串,每个