#Sum by Factors
# 给一个数组, 获取其中所有元素的质因子的集合,
# 对每个质因子, 求数组中所有包含该质因子的元素的和
# 返回一个二维数组,其中每个元素是有两个元素的数组,
# 第一个元素是质因子, 第二个元素是和
# 返回的二维数组应该按质因子的大小排序
# 例如:
# [12, 15] => [[2, 12], [3, 27], [5, 15]]
# 12 = 2 * 2 * 3, 2:12; 3:12+15=27; 5:15
# 我的解法
# Completed in 0.43ms
# Completed in 147.67ms
from collections import defaultdict
def get_factors(num,primes=set()):
num = abs(num)
#hasattr()函数用于判断对象是否包含对应的属性
#传入的参数是一个对象和一个字符串,如果对象包含有指定的属性返回True,否则返回False
factors = set()
# for prime in primes:
# if num%prime == 0:
# factors.add(prime)
# while num%prime==0:
# num//=prime
#除了2之外所有的质数都是奇数,
#先处理2,之后的factor就能每次+2而不是每次+1
#可以节省一半时间
while num%2==0:
factors.add(2)
num//=2
factor = 3
while factor*factor<=num:
# if factor in primes:
# factor+=2
# continue
if num%factor==0:
factors.add(factor)
while num%factor==0:
num//=factor
factor+=2
if num>1:
factors.add(num)
primes|=factors
return factors
def sum_for_list(lst):
sum_map = defaultdict(int)
primes = set()
for num in lst:
factors = get_factors(num,primes)
for factor in factors:
sum_map[factor]+=num
return sorted([[prime,sum_map[prime]] for prime in primes],key = lambda lis:lis[0])
a = [-29804, -4209, -28265, -72769, -31744]
a = [107, 158, 204, 100, 118, 123, 126, 110, 116, 100]
b = [[2, 1032], [3, 453], [5, 310], [7, 126], [11, 110], [17, 204], [29, 116], [41, 123], [59, 118], [79, 158], [107, 107]]
print(sum_for_list(a))