您的位置:首页 > 其它

[华为OJ] 判断两个IP是否属于同一子网

2016-07-12 15:32 399 查看
思路:

1. 判断子网掩码和IP地址的合法性(四个字段,每个字段在0~255);

2.题目原本是需要作“与”的运算,但是实际上,子网掩码每个字段不是255就是0(255表示网络号,0表示主机号),因此,当子网掩码的某个字段为255时,判断IP地址的相应字段是否相同即可。

代码:

#include <string>
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
//分割字符串
vector<string> mysplit(string s, string pattern){
vector<string> res;
s += pattern;
int size = s.size();
for(int i = 0; i < size;){
int pos = s.find(pattern,i);
if(pos < size){
string temp = s.substr(i,pos - i);
res.push_back(temp);
i = pos + pattern.size();
}
}
return res;
}
//判断子网掩码或IP地址的合法性
bool isOk(string s, vector<string> &res){
res = mysplit(s,".");
int size = res.size();
if(size != 4) return false;
for(int i = 0; i < size; i++){
stringstream ss;
int num;
ss << res[i]; //把原始数据扔进去
ss >> num; //根据num的类型扔出来
if(num > 255 || num < 0)
return false;
}
return true;
}
int checkNetSegment(string mask, string ip1, string ip2)
{
/*在这里实现功能*/
vector<string> vecMask, vecIp1, vecIp2;
bool test = isOk(mask,vecMask);
bool tes1t = isOk(ip1,vecIp1);
bool test2 = isOk(ip2,vecIp2);
if(isOk(mask,vecMask) && isOk(ip1,vecIp1) && isOk(ip2,vecIp2)){
for(int i = 0; i < 4; i++){
if(vecMask[i] == "255" && vecIp1[i] != vecIp2[i])
return 2;
}
}else
return 1;
return 0;
}

void main(){
string mask,ip1,ip2;
cin >> mask;
cin >> ip1;
cin >> ip2;

cout << checkNetSegment(mask,ip1,ip2);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: