原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
本题含有多组输入用例,每组用例需要你将一个ip地址转换为整数、将一个整数转换为ip地址。
输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址
输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
示例1
输入:
10.0.3.193
167969729
复制
输出:
167773121
10.3.3.193
只要思路清晰,直接求解就好了,不过有坑
/******************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
void fun1(string str)
{
int num[4];
int i=0;
char *p=(char*)str.data();
while(*p!='\0')
{
num[i]=atoi(p);
p=strstr(p,".");
if(p==NULL)
break;
p++;
i++;
}
long long sum=0;//long会溢出,需要用long long
for(i=0;i<4;i++)
{
sum+=num[i]*pow(256,3-i);
}
printf("%ld\n",sum);
}
void fun2(long num)
{
int buf[4]={0};
int i=0;
for(i=0;i<4;i++)
{
buf[i]=(num&(0xff<<i*8))>>i*8;
}
printf("%d.%d.%d.%d\n",buf[3],buf[2],buf[1],buf[0]);
}
int main()
{
long num;
while(1)
{
string str;
cin>>str;
if(str.empty())
break;
cin>>num;
fun1(str);
fun2(num);
}
return 0;
}

京公网安备 11010502036488号