2875 - 【设计型】第11章:指针和数组 子网掩码

子网掩码是用来判断任意两台计算机的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

C语言解答

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int main()
{
	int a[4] = {0};
	int e[4] = {0};
	int r_a[4] = {0};
	int i, j, k; 
	int temp_1;
	int temp_2;
	int temp_3;
	int temp_4;
	int temp_5;
	int temp_6;
	int temp_7;
	char a_B[4][8];
	char e_B[4][8];
	char r_B[4][8];
	scanf("%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]);
	scanf("%d.%d.%d.%d", &e[0], &e[1], &e[2], &e[3]);
	for(i = 0; i < 8; i++)
	{
		a_B[0][i] = '0';
		a_B[1][i] = '0';
		a_B[2][i] = '0';
		a_B[3][i] = '0';
		e_B[0][i] = '0';
		e_B[1][i] = '0';
		e_B[2][i] = '0';
		e_B[3][i] = '0';
		r_B[0][i] = '0';
		r_B[1][i] = '0';
		r_B[2][i] = '0';
		r_B[3][i] = '0';
	}
	for(i = 0; i < 4; i++)
	{
		temp_1 = 0;
		temp_4 = a[i];
		temp_5 = e[i];
		while(a[i])
		{
			temp_2 = a[i] % 2;
			a_B[i][temp_1] = '0' + temp_2;
			a[i] /= 2;
			temp_1++;
		}
		a[i] = temp_4;
		temp_1 = 0;
		while(e[i])
		{
			temp_2 = e[i] % 2;
			e_B[i][temp_1] = '0' + temp_2;
			e[i] /= 2;
			temp_1++;
		}
		e[i] = temp_5;	
		for(j = 0; j < 8; j++)
		{
			if(a_B[i][j] == '1' && e_B[i][j] == '1')
			{
				r_B[i][j] = '1';
			}
			else
			{
				r_B[i][j] = '0';
			}
			temp_6 = r_B[i][j] - '0';
			temp_7 = pow(2, j);
			r_a[i] += temp_6 * temp_7;	
		}
		
	}
	int n_i;
	int n;
	scanf("%d", &n);
	int *nResult = (int *)malloc(n*sizeof(int));
	char n_a_B[4][8];
	char n_r_B[4][8];
	int n_a[4] = {0};
	int n_r_a[4] = {0};
	for(n_i = 0; n_i < n; n_i++)
	{
		nResult[n_i] = 1;
		scanf("%d.%d.%d.%d", &n_a[0], &n_a[1], &n_a[2], &n_a[3]);
		for(i = 0; i < 8; i++)
	    {
		    n_a_B[0][i] = '0';
		    n_a_B[1][i] = '0';
		    n_a_B[2][i] = '0';
		    n_a_B[3][i] = '0';
	    	n_r_B[0][i] = '0';
	    	n_r_B[1][i] = '0';
		    n_r_B[2][i] = '0';
		    n_r_B[3][i] = '0';
	    }
	    for(i = 0; i < 4; i++)
	    {
	    	n_r_a[i] = 0;
	    } 
	    for(i = 0; i < 4; i++)
	    {
		    temp_1 = 0;
		    temp_4 = n_a[i];
		    while(n_a[i])
		    {
			    temp_2 = n_a[i] % 2;
			    n_a_B[i][temp_1] = '0' + temp_2;
			    n_a[i] /= 2;
			    temp_1++;
		    }
		    n_a[i] = temp_4;	
		    for(j = 0; j < 8; j++)
		    {
			    if(n_a_B[i][j] == '1' && e_B[i][j] == '1')
			    {
				    n_r_B[i][j] = '1';
			    }
			    else
			    {
				    n_r_B[i][j] = '0';
			    }
			    temp_6 = n_r_B[i][j] - '0';
			    temp_7 = pow(2, j);
			    n_r_a[i] += temp_6 * temp_7;	
	        }	
	    }
	    for(i = 0; i < 4; i++)
		{
			if(n_r_a[i] != r_a[i])
			{
				nResult[n_i] = 0;
				break;
			}
		}
    }
	for(i = 0; i < n; i++)
	{
		if(nResult[i])
		{
			printf("INNER\n");
		}
		else
		{
			printf("OUTER\n");
		}
	}
	return 0;
} 
时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题