您的位置:首页 > 产品设计 > UI/UE

GUETOJ - 1099 同网CS (模拟检查是否同在内网;ip,子网掩码是否正确)

2014-03-06 22:40 483 查看
http://acm.guet.edu.cn/problemset/problem/1099

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = 101;
int N, M;
struct IP
{
int ip[4], nm[4];

const bool checkIp()
{
if(ip[0] == 127 || ip[0] == 0 || ip[0] == 255) return false;
for(int i = 0; i < 4; i++)
if(ip[i] < 0 || ip[i] >255)
return false;
return true;
}
bool checkNetmask()
{
int cnt1 = 0, cnt2 = 0;
for(int i = 0, flag = 0; i < 4; i++)
{
if(nm[i] < 0 || nm[i] >255)
return false;
if(nm[i] == 0)
{
cnt1++;
continue;
}
else if(nm[i] == 255)
{
cnt2++;
continue;
}
int t = nm[i];
do
{
if(!(t & 1) && flag)
return false;
else if(t & 1)
flag = 1;
} while (t = t>>1);
}
if(cnt1 == 4 || cnt2 == 4)
return false;
return true;
}
IP(int t[], int u[])
{
for(int i = 0; i < 4; i++) ip[i] = t[i];
for(int i = 0; i < 4; i++) nm[i] = u[i];
}
IP(int t[])
{
for(int i = 0; i < 4; i++) ip[i] = t[i];
}
bool checkSame(IP ip1)
{
for(int i = 0; i < 4; i++)
if((ip1.ip[i]&nm[i]) != (ip[i]&nm[i]))
return false;
return true;
}

};
int getIp(int ip[])
{
int c;
if(scanf("%d", ip) == EOF)
return 0;
for(int i = 1; i < 4; i++)
scanf("%c%d", &c, &ip[i]);
return 1;
}
int main()
{
//freopen("in.txt", "r", stdin);
int ip[4], nm[4];
getIp(ip);
int f = getIp(nm);
IP myIp(ip, nm);
if(!myIp.checkIp())
printf("Invalid IP address.\n");
if(!myIp.checkNetmask() && f)
printf("Invalid netmask address.\n");

scanf("%d", &N);
while(N--)
{
getIp(ip);
IP ip1(ip);
if(!ip1.checkIp())
printf("Invalid IP address.\n");
else
{
if(myIp.checkSame(ip1))
printf("let's rock\n");
else
printf("not you\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  模拟