牛客[编程题] HJ33 整数与IP地址间的转换

发布时间 2023-11-10 15:02:27作者: 张德长
HJ33 整数与IP地址间的转换
中等  通过率:30.70%  时间限制:1秒  空间限制:32M
 

描述

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

组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
 
数据范围:保证输入的是合法的 IP 序列

 

输入描述:

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

输出描述:

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

示例1

输入:
10.0.3.193
167969729
输出:
167773121
10.3.3.193

 

 

using System;
    public class Program
    {
        public static void Main()
        {
            string line; string line1 = null, line2 = null;
            while ((line = System.Console.ReadLine()) != null)
            { // 注意 while 处理多个 case
                if (line1 == null)
                {
                    line1 = line;
                }
                else
                {
                    line2 = line;


                    string b1 = string.Empty;
                    foreach (var item in line1.Split("."))
                    {
                        b1 += DecimalToBinary(item,8);
                    }
                    string d1 = BinaryToDecimal(b1);
                    Console.WriteLine(d1);

                    string b2 = DecimalToBinary(line2, 32);
                    string d2 = string.Empty;
                    for (int i = 0; i < 4; i++)
                    {
                        d2 += BinaryToDecimal(b2.Substring(i*8, 8));
                        if (i != 3)
                        {
                            d2 += ".";
                        }
                    }
                    Console.WriteLine(d2);
                }
            }
        }
        static string DecimalToBinary(string d, int len)
        {
            string b = string.Empty;
            long n = long.Parse(d);
            while (n > 0)
            {
                b= b.Insert(0, (n % 2).ToString());
                n /= 2;
            }
            len -= b.Length;
            for (int i = 0; i < len ; i++)
            {
                b = b.Insert(0, "0");
            }
            return b;
        }
        static string BinaryToDecimal(string b)
        {
            long n = 0;
            for (int i = 0; i < b.Length; i++)
            {
                if (b[b.Length-1 - i] == '1')
                {
                    n += Pow(2, i);
                }
            }
            return n.ToString();
        }
        static long Pow(long a, long n)
        {
            long res = 1;
            for (int i = 0; i < n; i++)
            {
                res *= a;
            }
            return res;
        }
    }