描述
对一个数据a进行分类,分类方法是,此数据a(4个字节大小)的4个字节相加对一个给定值b取模,如果得到的结果小于一个给定的值c,则数据a为有效类型,其类型为取模的值。如果得到的结果大于或者等于c则数据a为无效类型。
比如一个数据a = 0x01010101,b = 3,按照分类方法计算:(0x01 + 0x01 + 0x01 + 0x01) % 3 = 1,所以如果c等于2,则此a就是有效类型,其类型为1。如果c等于1,则此a是无效类型。
又比如一个数据a = 0x01010103,b = 3,按分类方法计算:(0x01 + 0x01 + 0x01 + 0x03) % 3 = 0,所以如果c = 2则此a就是有效类型,其类型为0。如果c = 0则此a是无效类型。
输入描述:
输入12个数据用空格分割,第一个数据为c,第二个数据为b,剩余10个数据为需要分类的数据。
输出描述:
请找到有效类型中包含数据最多的类型,并输出该类型含有多少个数据。
示例1
输入: 3 4 256 257 258 259 260 261 262 263 264 265
输出: 3
说明:
这10个数据4个字节相加后的结果分别是
1 2 3 4 5 6 7 8 9 10
故对4取模的结果为
1 2 3 0 1 2 3 0 1 2
c是3 所以0 1 2 都是有效类型
类型为1和2的都有3个数据
类型为0和3的只有两个
input_str = input()
input_list = input_str.split()
c = int(input_list[0])
b = int(input_list[1])
data = [int(x) for x in input_list[2:]]#不可直接int,会报错
def class_data(c,b,data):
res = {}
for i in data: #遍历`data`列表中的每个元素`i`。
tmp = str(i)
tmp = "0" * (8 - len(tmp)) + tmp #将元素`i`转换为字符串类型,并在前面补0,使其长度为8。
sum = 0 #初始化一个变量`sum`用于存储当前元素对应的十六进制字符串的前8位数字之和。
for j in range(0, len(tmp), 2): #遍历当前元素的十六进制字符串,每两个字符为一组
g = tmp[j:j + 2]
sum += int(g, 16) #计算它们的十进制值并累加到`sum`中。
#int(g, 16)`表示将字符串g从十六进制转换为十进制整数。
mo = sum % b #计算`sum`对`b`取模的结果`mo`。
if mo < c: #如果`mo`小于`c`,则检查`res`字典中是否已经存在键为`mo`的项
if mo not in res.keys(): #在`res`字典中添加一个键为`mo`,值为0的项;如果已存在,则将其值加1。
res[mo] = 0
res[mo] += 1
res = sorted(res.items(), key=lambda x: x[1], reverse=True)[0][1]# 对`res`字典中的键值对按照值进行降序排序,输出第一个键值对的值(即满足条件的元素个数)
return res
print(class_data(c,b,data))