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