#include <iostream> #include <vector> using namespace std; vector<size_t> ipToVector(string ip){ vector<size_t> v; int pos = ip.find_first_of('.'); v.push_back(stoi(ip.substr(0,pos))); ip = ip.substr(pos+1); pos = ip.find_first_of('.'); v.push_back(stoi(ip.substr(0,pos))); ip = ip.substr(pos+1); pos = ip.find_first_of('.'); v.push_back(stoi(ip.substr(0,pos))); ip = ip.substr(pos+1); pos = ip.find_first_of('.'); v.push_back(stoi(ip.substr(0,pos))); ip = ip.substr(pos+1); return v; } bool isValidIp(string ip){ bool bisValid = true; // 解析出每一段数字,判断是否在 0 到 255之间 vector<size_t> v = ipToVector(ip); for(auto t : v){ if(t < 0 || t > 255){ bisValid = false; } } return bisValid; } bool isValidMask(string ip){ bool bisValid = true; // 先判断是否是合格IP if(!isValidIp(ip)){ bisValid = false; }else{ vector<size_t> v = ipToVector(ip);; int len = v.size(); for(int i = 0; i < len -1; ++i){ if(v[i] < 255 && v[i+1] > 0){ bisValid = false; } } } return bisValid; } size_t ipToInt(string ip){ vector<size_t> v = ipToVector(ip); size_t ans = 0; for(auto t : v){ ans |= t; ans = ans << 8; } return ans; } bool isSameNetWork(string ip1, string ip2, string mask){ size_t ip11 = ipToInt(ip1); size_t ip22 = ipToInt(ip2); size_t mask1 = ipToInt(mask); return (ip11 & mask1) == (ip22 & mask1); } int main() { string mask, ip1, ip2; while(cin >> mask >> ip1 >> ip2){ if(!isValidMask(mask) || !isValidIp(ip1) || !isValidIp(ip2)){ cout << 1 << endl; continue; } if(isSameNetWork(ip1,ip2,mask)){ cout << 0 << endl; // 属于同一网络打印 0 }else{ cout << 2 << endl; // 不属于同一网络打印 2 } } } // 64 位输出请用 printf("%lld")