// 真是又臭又长的代码 20240927 #include <iostream> #include <vector> using namespace std; bool isValidIp(string ip){ bool bisValid = true; // 解析出每一段数字,判断是否在 0 到 255之间 vector<string> v; int pos = ip.find_first_of('.'); v.push_back(ip.substr(0,pos)); ip = ip.substr(pos+1); pos = ip.find_first_of('.'); v.push_back(ip.substr(0,pos)); ip = ip.substr(pos+1); pos = ip.find_first_of('.'); v.push_back(ip.substr(0,pos)); ip = ip.substr(pos+1); pos = ip.find_first_of('.'); v.push_back(ip.substr(0,pos)); ip = ip.substr(pos+1); for(auto s : v){ int t = stoi(s); if(t < 0 || t > 255){ bisValid = false; } } return bisValid; } bool isValidMask(string ip){ bool bisValid = true; // 先判断是否是合格IP if(!isValidIp(ip)){ bisValid = false; }else{ vector<string> v; int pos = ip.find_first_of('.'); v.push_back(ip.substr(0,pos)); ip = ip.substr(pos+1); pos = ip.find_first_of('.'); v.push_back(ip.substr(0,pos)); ip = ip.substr(pos+1); pos = ip.find_first_of('.'); v.push_back(ip.substr(0,pos)); ip = ip.substr(pos+1); pos = ip.find_first_of('.'); v.push_back(ip.substr(0,pos)); ip = ip.substr(pos+1); size_t ans = 0; int len = v.size(); for(int i = 0; i < len -1; ++i){ int vi = stoi(v[i]); int vii = stoi(v[i+1]); if(vi < 255 && vii > 0){ bisValid = false; } } } return bisValid; } size_t ipToInt(string ip){ vector<string> v; int pos = ip.find_first_of('.'); v.push_back(ip.substr(0,pos)); ip = ip.substr(pos+1); pos = ip.find_first_of('.'); v.push_back(ip.substr(0,pos)); ip = ip.substr(pos+1); pos = ip.find_first_of('.'); v.push_back(ip.substr(0,pos)); ip = ip.substr(pos+1); pos = ip.find_first_of('.'); v.push_back(ip.substr(0,pos)); ip = ip.substr(pos+1); size_t ans = 0; for(auto s : v){ size_t t = stoi(s); ans |= t; ans = ans << 8; } return ans; } bool isSameNetWork(string ip1, string ip2, string mask){ bool bisSame = true; size_t ip11 = ipToInt(ip1); size_t ip22 = ipToInt(ip2); size_t mask1 = ipToInt(mask); size_t and1 = (ip11 & mask1); size_t and2 = (ip22 & mask1); return and1 == and2; } 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")