本题的核心是等长子网划分:给定一个主网段 CIDR,需要划分出若干掩码长度相同的子网,且每个子网的可用主机数能容纳对应部门的需求。
算法分为以下几步:
将 CIDR 格式字符串(如 "192.168.1.0/24")拆分为 IP 地址和掩码位数两部分。IP 地址按 . 分割为 4 个字节,合并为一个 32 位无符号整数,方便后续做偏移计算。
某企业新申请到一个完整的 IPv4 主网段,网络管理员需要根据各部门申报的最小主机需求数量,制定子网划分方案。
请你编写一个程序根据主网段信息、部门数量及各需求,自动计算满足所有部门需求的最小主机数网段,并按申请部门信息连续分配等长子网。
参数1:合法的 IPv4 主网段(CIDR 格式,即 IP 地址/掩码位数),例如:192.168.10.0/24,24 表示子网掩码中二进制 1 的个数,等价于 255.255.255.0(前 24 位为 1);
参数2:正整数 N,表示部门数量(1≤N≤20);
参数3:整型数组,代表 N 个部门各自的最小主机需求数。
若分配可行,输出一个包含 N 个 CIDR 字符串的数组格式,按升序排列:[CIDR1, CIDR2, CIDR3, ..., CIDRn];
若输入网段非法、主机位不足 2 位,或计算发现无法同时满足所有部门的主机数需求和子网数量需求,输出 [];
192.168.1.0/24 表示支持 254 个主机(32−24=8,28=256,减去 2 为 254,表示 192.168.1.1~192.168.1.254);192.168.1.0/24);输入
"192.168.1.0/24",3,[10,20,50]
输出
["192.168.1.0/26","192.168.1.64/26","192.168.1.128/26"]
说明
192.168.1.0/24,前缀 24,主机位 h=32−24=8。192.168.1.0/26(需求 10,可用 62)192.168.1.64/26(需求 20,可用 62)192.168.1.128/26(需求 50,可用 62)输入
"192.168.1.0/24",20,[100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100]
输出
[]
说明
输入
"192.168.1.0/24",2,[10,10]
输出
["192.168.1.0/28","192.168.1.16/28"]
说明
192.168.1.0/24,前缀 24,主机位 h=32−24=8。192.168.1.0/28(需求 10,可用 14)192.168.1.16/28(需求 10,可用 14)
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.