【华为 OJ 】整数与IP地址间的转换

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字             相对应的二进制数
10                   00001010
0                    00000000
3                    00000011
193                  11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

 

的每段可以看成是一个0-255的整数,需要对IP地址进行校验

 

 

 


输入描述:

输入  1 输入IP地址 2 输入10进制型的IP地址



输出描述:

输出 1 输出转换成10进制的IP地址 2 输出转换后的IP地址


输入例子:
10.0.3.193
167969729

输出例子:
167773121

10.3.3.193

#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
vector <int> fun(long num)
{
    vector <int> vec1;
    int n;
    while (num)
    {
        n = num % 2;
        vec1.push_back(n);
        num /= 2;
    }
    while (vec1.size() % 8 != 0)
    {
        vec1.push_back(0);
    }
    return vec1;
}
 
int main()
{
    char str[1000];
    while (cin >> str)
        {
    long a;
    cin >> a;
    vector <int> vec1;
    vector <int> vec2;
    vector <char*> vec;
    char* p = strtok(str, ".");
    while (p)
    {
        vec.push_back(p);
        p = strtok(NULL, ".");
    }
    int m, n;
    for (int i = vec.size()-1; i >= 0; i--)
    {
        m = atoi(vec[i]);//切割后是字符串,要转换为数字才能使用
        if (m == 0)
            vec1.push_back(m);
        else
        {
            while (m)
            {
                n = m % 2;
                vec1.push_back(n);
                m /= 2;
            }
        }
        while (vec1.size() % 8!=0)
        {
            vec1.push_back(0);
        }
    }
    long sum = 0;
    for (int i = vec1.size() - 1; i >= 0; i--)
    {
        sum =sum*2+ vec1[i];二进制转为十进制,两次倒序后为正序
    }
    cout << sum << endl;
 
    vec1 = fun(a);
    int c = 0, d = 0;
    for (int i = vec1.size() - 1; i >= 0; i--)
    {
        c++;
        d = d * 2 + vec1[i];
        if (c % 8 == 0)
        {
            vec2.push_back(d);
            d = 0;
        }
    }
    for (int i = 0; i < vec2.size()-1; i++)
        cout << vec2[i] << ".";
    cout << vec2[vec2.size() - 1];
    cout << endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值