#include <iostream> #include <array> using namespace std; bool check(array<int, 4>&arr){ for (int i = 0; i < 4; i++) if (arr[i] < 0 || arr[i] > 255) return 0; return 1; } string to2(int n){//---------转二进制但不补前导零 string s = ""; while (n){ s = (char)(n % 2 + '0') + s; n>>=1; } return s; } bool check(array<int, 4>&arr, int n){//----------重载check函数,用于检测子网是否前零后一,思路是模拟 bool flag = 0; int i = 0; while (i < 4 && arr[i] == 255) i++; int j = 0; string s = to2(arr[i]); size_t size = s.size(); while (j < size && s[j] == '1') j++; while (j < size){ if (s[j] != '0') flag = 1; j++; } i++; while(i < 4 && arr[i] == 0) i++; if (i != 4) flag = 1; return flag != 1; } int main() { array<int, 4> a, b, c; auto for_rd = [&](array<int, 4>& arr){//------获取输入 char c; cin>>arr[0]; for (int i = 1; i < 4; i++){ cin >> c;cin >> arr[i]; } }; auto operate = [&](){for(int i=0;i<4;i++){b[i]=a[i]&b[i];c[i]&=a[i];}};//--------这个可以直接展开不用这样写的 for_rd(a);for_rd(b);for_rd(c); if (check(a) && check(b) && check(c) && check(a, 0)){ operate(); bool flag = 0; for (int i = 0; i < 4; i++){ if (b[i] != c[i]) flag = 1; } if (flag) cout << 2 << endl; else cout << 0 << endl; } else{ cout << 1 << endl; } return 0; } // 64 位输出请用 printf("%lld")