题目
存在一种虚拟IPv4地址,由4小节组成,每节的范围为0~128,以#号间隔,格式如下:
(1~128)#(0~255)#(0~255)#(0~255)
请利用这个特性把虚拟IPv4地址转换为一个32位的整数,IPv4地址以字符串形式给出,要求每个IPvV4地址只能对应到唯一的整数上。
如果是非法IPv4,返回invalid IP。输入描述
输入一行,虚拟IPv4地址格式字符串
输出描述
输出一行,按照要求输出整型或者特定字符
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
100#101#1#5
输出
1684340997
示例2 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
1#2#3
输出
invalid IP
思路
1:字符串处理 位变化 << >>
#include<iostream>
#include<vector>
#include<algorithm>
#include<sstream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int main() {
string str;
getline(cin, str);
stringstream ss(str);
vector<int> ipvalue;
int point = -1;
while(getline(ss, str, '#')) {
int val = stoi(str);
if(val < 1 || val > 255) {
cout << "invalid IP" << endl;
system("pause");
return 0;
}
ipvalue.push_back(val);
point++;
}
if(point < 3 || ipvalue.size() != 4) {
cout << "invalid IP" << endl;
system("pause");
return 0;
}
long long res;
for(int i = 0; i < ipvalue.size(); i++) {
res += ipvalue[i] << (point-i)*8;
}
cout << res << endl;
system("pause");
return 0;
}
或者 c scanf处理
#include<stdio.h>
int validip(int* arr) {
if(arr[0] < 1 || arr[0] > 128) {
return 0;
}
for (int i = 1; i < 4; i++) {
if (arr[i] > 255 || arr[i] < 0)
return 0;
}
return 1;
}
int main() {
int ip[4] = { -1,-1,-1,-1 };
while (scanf("%d#%d#%d#%d", ip, ip+1,ip+2,ip+3) != EOF) {
if (!validip(ip))
printf("1\n");
else {
unsigned u = 0;
for (int i = 0; i < 4; i++)
u = u * 256 + ip[i];
printf("%d", u);
}
}
}