1. 程式人生 > >【華為 OJ 】整數與IP地址間的轉換

【華為 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;
}