子网掩码
时间限制: 1 Sec 内存限制: 32 MB
题目描述
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。就这么简单。
请看以下示例:
运算演示之一:
IP地址 192.168.0.1
子网掩码 255.255.255.0
转化为二进制进行运算:
IP地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算:
11010000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
运算演示之二:
IP地址 192.168.0.254
子网掩码 255.255.255.0
转化为二进制进行运算:
IP地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000
AND运算:
11010000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
运算演示之三:
IP地址 192.168.0.4
子网掩码 255.255.255.0
转化为二进制进行运算:
IP地址 11010000.10101000.00000000.00000100
子网掩码 11111111.11111111.11111111.00000000
AND运算:
11010000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
通过以上对三组计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的,均为192.168.0.0,所以计算机就会把这三台计算机视为在同一子网络。
输入
输入的第一行是本机IP地址;
第二行是子网掩码;
第三行是一个整数N,表示后面有N个IP地址;
接下来N行:
第1个IP地址
…
…
第N个IP地址
输出
计算并输出N个IP地址是否与本机在同一子网内。对于在同一子网的输出“INNER”,对于在不同子网的输出“OUTER”。
样例输入
192.168.0.1
255.255.255.0
3
192.168.0.2
192.168.0.254
192.168.1.2
样例输出
INNER
INNER
OUTER
题意概括
给出一个计算机的ip地址,和子网掩码,在给出n个ip问之后给的ip地址和之前给出的ip地址是不是在一个网络中。
解题思路
我当时计算的时候是根据题中给出的定义,计算成二进制之后一位一位的进行计算的,虽然当时考虑到了使用&这个运算符,当时为了保证正确率还是转化为二进制判断之后再转化回来进行判断的、
代码如下
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<algorithm>
using namespace std;
int aa[4];
int ff(int a,int b)
{
int ch1[10]={0};
int ch2[10]={0};
int i;
for(i=0;i<9;i++){
ch1[i]=a%2;
a/=2;
}
for(i=0;i<9;i++){
ch2[i]=b%2;
b/=2;
}
int sum=0;
for(i=8;i>=0;i--){
if(ch1[i]==1&&ch2[i]==1){
sum=sum*2+1;
}
else sum=sum*2;
}
return sum;
}
int main ()
{
int a[4];
int b[4];
int n,m,i,j;
while(~scanf(" %d%*c%d%*c%d%*c%d",&aa[0],&aa[1],&aa[2],&aa[3])){
scanf("%d%*c%d%*c%d%*c%d",&a[0],&a[1],&a[2],&a[3]);
for(i=0;i<4;i++){
aa[i]=ff(aa[i],a[i]);
}
scanf("%d",&n);
while(n--){
scanf("%d%*c%d%*c%d%*c%d",&b[0],&b[1],&b[2],&b[3]);
int y=1;
for(i=0;i<4;i++){
if(aa[i]!=ff(a[i],b[i])){
y=0;
}
}
if(y==1){
printf("INNER
");
}else printf("OUTER
");
}
}
return 0;
}