如何解决列表元组解包问题并统计t-prime数的约数个数?
解决Codeforces 230B的T-prime数判断:统计元组列表中每个数的约数个数
我们的目标是统计给定元组列表中每个目标数对应的不同正约数数量,以此判断该数是否为T-prime数(定义为恰好拥有3个不同正约数的数)。给定的元组列表示例如下:
[(4, 1), (4, 2), (4, 4), (5, 1), (5, 5), (6, 1), (6, 2), (6, 3), (6, 6)]
方法1:用普通字典统计
通过遍历列表,用字典存储每个数对应的约数集合(自动去重),最后计算集合长度得到约数个数:
def count_divisors(tuple_list): divisor_counts = {} for num, div in tuple_list: # 若数不在字典中,初始化空集合 if num not in divisor_counts: divisor_counts[num] = set() # 添加约数到集合(自动去重) divisor_counts[num].add(div) # 转换为{数: 约数个数}的字典 return {num: len(divs) for num, divs in divisor_counts.items()} # 测试示例 sample_list = [(4, 1), (4, 2), (4, 4), (5, 1), (5, 5), (6, 1), (6, 2), (6, 3), (6, 6)] print(count_divisors(sample_list)) # 输出: {4: 3, 5: 2, 6: 4}
方法2:用collections.defaultdict简化代码
借助defaultdict可以省去初始化空集合的判断,让代码更简洁:
from collections import defaultdict def count_divisors(tuple_list): divisor_sets = defaultdict(set) for num, div in tuple_list: divisor_sets[num].add(div) return {num: len(divs) for num, divs in divisor_sets.items()}
后续判断T-prime数
得到统计结果后,只需检查每个数的约数个数是否为3即可:
result = count_divisors(sample_list) for num, cnt in result.items(): if cnt == 3: print(f"{num} 是T-prime数") else: print(f"{num} 不是T-prime数")
内容的提问来源于stack exchange,提问作者atvk112233
相关产品推荐
相关产品推荐

