判斷兩個ip地址是否屬於同一網段/華為2020春招機試(C/C++)


題目描述

子網掩碼是用來判斷任意兩台計算機的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地址,子網掩碼。中間用空格隔開

輸出描述:

輸出1和第一個ip跟掩碼相與后的操作結果; 或者輸出0和第一個ip跟掩碼相與后的操作結果;

示例1

  • 輸入

    192.168.1.1 192.168.1.2 255.255.255.0
    
  • 輸出

    1 192.168.1.0
    

解題思路

  • 此題本質上是一個考察字符串知識點的題,不要陷入把十進制轉換成二進制的陷阱。
  • 首先對給定的ip地址分成4塊(子網掩碼也是如此),首先想到根據點分十進制記法,每塊由.隔開,以.為判斷條件進行分割。但是ip地址的第4部分后面沒有.,所以在接收到ip地址后,在末尾追加一個.,便於統一操作。注意加.的操作
  • 每塊分割后,分別一一對應使用&進行與運算,得到運算結果后比對,即可知道兩個ip是否屬於同一個網段,按照題目要求格式輸出即可

參考代碼

#include <iostream>
#include <vector>

using namespace std;

void ip2number(string str, vector<int> &v){  // 將string中的ip地址划分為4份,並轉化為int型數據
    string strTemp;
    for(int i = 0; i < str.length(); i++){
        if(str[i]!='.'){
              strTemp += str[i];
        }
        else{
            if(strTemp.length() == 3){
            v.push_back((strTemp[0]-48)*100+(strTemp[1]-48)*10+(strTemp[2]-48)*1);
            strTemp = "";
            }
            else if(strTemp.length()==2){
            v.push_back((strTemp[0]-48)*10+(strTemp[1]-48)*1);
            strTemp = "";
            }
            else{
            v.push_back((strTemp[0]-48)*1);
            strTemp = "";
            }
        }
    }
}


int main()
{
    string ip1, ip2, mask;
    cin >> ip1 >> ip2 >> mask;
    ip1=ip1+'.';  //在輸入的字符串末尾+'.',便於划分處理
    ip2=ip2+'.';
    mask = mask+'.';
    vector<int> vIp1, vIp2, vMask;
    ip2number(ip1, vIp1);  //轉化string 為 vector<int>
    ip2number(ip2, vIp2);
    ip2number(mask, vMask);
    int num0 = vIp1[0]&vMask[0];  //ip1每一段分別和掩碼做與操作
    int num1 = vIp1[1]&vMask[1];
    int num2 = vIp1[2]&vMask[2];
    int num3 = vIp1[3]&vMask[3];

    int um0 = vIp2[0]&vMask[0];  //ip2每一段分別和掩碼做與操作
    int um1 = vIp2[1]&vMask[1];
    int um2 = vIp2[2]&vMask[2];
    int um3 = vIp2[3]&vMask[3];
    if(num0 == um0 && num1 ==um1 && num2 ==um2 && num3 == um3){
        cout<<1<<" ";
    }
    else{
        cout<<0<<" ";
    }
    cout<<num0<<"."<<num1<<"."<<num2<<"."<<num3;  //輸出第一個ip地址和子網掩碼相與后的結果
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM