1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <iostream> #include <string> #include <sstream> #include <vector> #include <cmath> using namespace std;
bool isnumber(const string &num) { for (char ch : num) { if (!isdigit(ch)) { return false; } } return true; }
int main() {
std::string input; getline(cin, input);
istringstream iss(input); std::vector<string> numbers; std::string section; while (getline(iss, section, '#')) { numbers.push_back(section); }
if (numbers.size() != 4) { cout << "invalid IP" << endl; return 0; } for (const auto &number : numbers) { if (number.empty() || !isnumber(number)) { cout << "invalid IP" << endl; return 0; } if (number.size() > 1 && number[0] == '0') { cout << "invalid IP" << endl; return 0; } }
auto num_temp = stoi(numbers[0]); if (num_temp < 0 || num_temp > 128) { cout << "invalid IP" << endl; return 0; } for (int i = 1; i < 4; ++i) { num_temp = stoi(numbers[i]); if (num_temp < 0 || num_temp > 255) { cout << "invalid IP" << endl; return 0; } } long long result; result = stoi(numbers[0])*pow(2, 24) + stoi(numbers[1])*pow(2, 16) + stoi(numbers[2])*pow(2, 8) + stoi(numbers[3])*pow(2, 0);
cout << result << endl; return 0; }
|
这道题主要是先排除各种特殊情况,这些特殊情况意味着 IPV4
地址的不规范。拿到合法的 IPV4 之后,计算整数即可。
那么如何把 IPV4 地址 转换为 整数?
分解每个部分:虚拟IPv4地址由四个部分组成,例如
128#0#255#255
。我们将其表示为 A.B.C.D
,其中
A、B、C 和 D 分别是四个部分。
转换为整数:将每个部分当作一个字节(0~255),然后将其合并为一个32位整数。合并的过程是按从左到右的顺序进行,每个部分的值会根据其位置乘以对应的位移量。具体的位移量如下:
- A 乘以 2^24(即 16777216)
- B 乘以 2^16(即 65536)
- C 乘以 2^8(即 256)
- D 不需要位移
所以,转换公式为:32位整数 = A * 2^24 + B * 2^16 + C * 2^8 + D