题目
描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成 一个长整数。 举例:一个ip地址为10.0.3.193
每段数字相对应的二进制数
100000101000000000030000001119311000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。 每段可以看成是一个0-255的整数,需要对IP地址进行校验
知识点
字符串,位运算
运行时间限制
10M
内存限制
128
输入
输入IP地址输入10进制型的IP地址
输出
输出转换成10进制的IP地址输出转换后的IP地址
样例输入
10.0.3.193 167969729
样例输出
167773121 10.3.3.193
思路
由于输入可知,所有不必判断输入的类型,可以直接进行相应的转换。如果不知道输入类型,可以通过
.
分隔符来区分IP地址和数字
代码
#include <iostream>
#include <string>
using namespace std;
string StringToBin(
string str)
{
int num=atoi(str.c_str());
string tmp;
char tmp1[
10]= {
0};
itoa(num,tmp1,
2);
tmp=
string(tmp1);
if (tmp.size()<
8)
{
string tmp2(
8-tmp.size(),
'0');
str=tmp2+tmp;
}
else
{
str=tmp;
}
return str;
}
int BintoDec(
string str)
{
int result=
0,i=
0;
while(str[i]!=
'\0')
{
result=(result<<
1)+(str[i++]-
'0');
}
return result;
}
int IPtoInt(
string ip1)
{
string str1[
4],test;
int i=
0,k=
0,flag=
0;
while(i<ip1.size())
{
int tmp=i;
while(
isdigit(ip1[tmp]))
tmp++;
str1[k]=ip1.substr(i,tmp-i);
k++;
i=tmp+
1;
}
for(
int i=
0; i<
4; i++)
{
if(atoi(str1[i].c_str())<
256 &&atoi(str1[i].c_str())>=
0)
{
flag++;
}
}
if(flag==
4)
{
for (
int i=
0; i<
4; i++)
{
string temp=StringToBin(str1[i]);
test+=temp;
}
}
else
{
return -
1;
}
return BintoDec(test);
}
void IntoIp(
int n)
{
string s,tmp;
int a,b,c,d;
char tmp1[
32]= {
0};
itoa(n,tmp1,
2);
tmp=
string(tmp1);
if (tmp.size()<
32)
{
string tmp2(
32-tmp.size(),
'0');
s=tmp2+tmp;
}
else
{
s=tmp;
}
a=BintoDec(s.substr(
0,
8));
b=BintoDec(s.substr(
8,
8));
c=BintoDec(s.substr(
16,
8));
d=BintoDec(s.substr(
24,
8));
cout<<a<<
"."<<b<<
"."<<c<<
"."<<d<<endl;
}
int main()
{
string ip;
int num;
cin>>ip;
cin>>num;
cout<<IPtoInt(ip)<<endl;
IntoIp(num);
return 0;
}
致敬作者
转载请注明原文地址: https://ju.6miu.com/read-12893.html