习题4-5 IP网络(IP Networks,ACM/ICPC NEERC 2005,UVa1590)

原题链接:https://vjudge.net/problem/UVA-1590
分类:函数
备注:二进制
题意解释:对于给出个m个IP地址,按照"byte0.byte1.byte2.byte3"从前往后数,连续的最长相同序列的长度就为题目要求的32-n,(注意:不论这个序列最后一位是不是0,我在这里被坑了一下),前32-n位不动,后n位则是可以任意变动的,将其都置0再输出就可以了,子网掩码则是前32-n位置1,后n位置0然后输出。

代码如下:

#include<stdio.h>
const int maxm = 1000 + 5;
int m, binary[maxm][35];
void Put(int pos)
{
	int a = 0, b = 0, c = 0, d = 0;
	int A = 0, B = 0, C = 0, D = 0, ans[35] = { 0 };
	for (int i = pos; i <= 32; i++)
		binary[m][i] = 0;
	for (int i = 1; i < pos; i++)
		ans[i] = 1;
	for (int i = 8; i >= 1; i--)
	{
		a += binary[m][i] << (8 - i);
		A += ans[i] << (8 - i);
	}
	for (int i = 16; i >= 9; i--)
	{
		b += binary[m][i] << (16 - i);
		B += ans[i] << (16 - i);
	}
	for (int i = 24; i >= 17; i--)
	{
		c += binary[m][i] << (24 - i);
		C += ans[i] << (24 - i);
	}
	for (int i = 32; i >= 25; i--)
	{
		d += binary[m][i] << (32 - i);
		D += ans[i] << (32 - i);
	}
	printf("%d.%d.%d.%d\n%d.%d.%d.%d\n", a, b, c, d, A, B, C, D);
}
int main(void)
{
	while (~scanf("%d", &m))
	{
		int a, b, c, d, pos = 33;
		for (int i = 1; i <= m; i++)
		{
			scanf("%d.%d.%d.%d", &a, &b, &c, &d);
			for (int j = 8; j >= 1; j--) { binary[i][j] = a % 2; a /= 2; }
			for (int j = 16; j >= 9; j--) { binary[i][j] = b % 2; b /= 2; }
			for (int j = 24; j >= 17; j--) { binary[i][j] = c % 2; c /= 2; }
			for (int j = 32; j >= 25; j--) { binary[i][j] = d % 2; d /= 2; }
		}
		for (int j = 1; j <= 32; j++)
		{
			int tmp = binary[1][j], flag = 0;
			for (int i = 2; i <= m; i++)
				if (tmp != binary[i][j]) { flag = 1; break; }
			if (flag) { pos = j; break; }
		}
		Put(pos);
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JILIN.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值