其他分享
首页 > 其他分享> > CUMTOJ数据结构实验一

CUMTOJ数据结构实验一

作者:互联网

CUMTOJ数据结构实验一

问题 A: 子网掩码

题目描述

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

思路

首先,利用scanf的特殊输入方式去除小数点,将输入的ip地址存储在数组中,然后,利用&进行与操作,最后进行比较即可

代码
#include<iostream>
using namespace std;
int main() {
	int local_ip[4] , subnet_mask[4] , test_ip[4];
	int local_ip_subnet_mask[4] , test_ip_subnet_mask[4];
	scanf("%d.%d.%d.%d" , &local_ip[0] , &local_ip[1] , &local_ip[2] , &local_ip[3]);
	scanf("%d.%d.%d.%d" , &subnet_mask[0] , &subnet_mask[1] , &subnet_mask[2] , &subnet_mask[3]);
	int i = 0;
	while(i < 4) {
		local_ip_subnet_mask[i] = local_ip[i] & subnet_mask[i];
		i++;
	}
	int N;
	cin >> N;
	for(int j = 0;j < N;j++) {
		scanf("%d.%d.%d.%d" , &test_ip[0] , &test_ip[1] , &test_ip[2] , &test_ip[3]);
		i = 0;
		while(i < 4) {
			test_ip_subnet_mask[i] = subnet_mask[i] & test_ip[i];
			i++;
		}
		int k = 0;
		for(i = 0; i < 4; i++) {
			if(test_ip_subnet_mask[i] != local_ip_subnet_mask[i]) {
				k = 1;
				cout << "OUTER" << endl;
				break;
			}
		}
		if(!k)
			cout << "INNER" << endl;
	}
	return 0;
}

问题 B: 快来秒杀我

题目描述

根据前几次竞赛的情况,这次为了给新手们一点信心,特提供这道秒杀题来让大家杀。
ASCII码大家应该都学过了,现在给你一个很简单的任务,输入数字,表示ASCII码,输出对应的文本内容。

输入

输入的第一行是一个整数T(1<=T<=100)。
接下来输入T个正整数,这些数之间用空格、换行或Tab键来分隔。
测试数据保证输入的整数都在ASCII码范围内,并且不小于32。

输出

在一行中输出对应的文本内容。

样例输入

13
72 101 108 108 111 44
32 119 111 114 108 100 33

样例输出

Hello, world!

思路

首先,用source_num存储刚刚输入的数字,然后,立即强制将其转化成字符形式即可

代码
#include<iostream>
using namespace std;
int main() {
	int T = 0 , source_num;
	cin >> T;
	int tmp = 0;
	for(; tmp < T; tmp++) {
		cin >> source_num;
		cout << (char)(source_num);
	}
	return 0;
}

问题 C: 最短路径1

题目描述

有n个城市m条道路(n<1000, m<10000),每条道路有个长度,请找到从起点s到终点t的最短距离和经过的城市名。

输入

输入包含多组测试数据。

每组第一行输入四个数,分别为n,m,s,t。

接下来m行,每行三个数,分别为两个城市名和距离。

输出

每组输出占两行。

第一行输出起点到终点的最短距离。

第二行输出最短路径上经过的城市名,如果有多条最短路径,输出字典序最小的那条。若不存在从起点到终点的路径,则输出“can’t arrive”。

样例输入

3 3 1 3
1 3 3
1 2 1
2 3 1

样例输出

2
1 2 3

思路

首先,,然后,

代码

标签:subnet,子网掩码,ip,mask,192.168,实验,IP地址,CUMTOJ,数据结构
来源: https://blog.csdn.net/qq_41509200/article/details/101063880