牛客[编程题] 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;
}
}