|
发表于 2019-6-24 14:28:26
|
显示全部楼层
本帖最后由 王小召 于 2019-6-24 14:31 编辑
借用楼上答案, 本题重点:对于大数据查找效率考量,速度从快到慢:set > dict > list 如果本题第16行用 if num in b_nums(也就是:in + list模式) 做替换,用时可能会多百倍,复杂度会从O(log N) 编程了 O(N)!!
结果是:{134043: [3, 7, 13, 491], 134044: [2, 2, 23, 31, 47], 134045: [5, 17, 19, 83], 134046: [2, 3, 3, 11, 677]}
用时:0.6084039 秒import time
def prime(N):
bool_num = [1] * N
bool_num[0], bool_num[1] = 0, 0
for i, j in enumerate(bool_num):
if j:
for x in range(i**2, N, i):
bool_num[x] = 0
return [i for i, j in enumerate(bool_num) if j]
def composite_numbers(num, b_nums, s_nums, result = []):
if num in s_nums:
result.append(num)
return [num]
sqr_n = num**0.5 + 1
for each_prime in b_nums:
if not num % each_prime:
result.append(each_prime)
composite_numbers(int(num/each_prime), b_nums, s_nums, result)
break
elif each_prime > sqr_n:
break
return result
def cal_(N):
b_nums = prime(N)
s_nums = set(b_nums)
d_result = {}
for number in range(647, N):
tmp = composite_numbers(number, b_nums, s_nums, [])
if len(set(tmp)) == 4:
d_result[number] = tmp
else:
d_result.clear()
if len(d_result) == 4:
return d_result
print("结果是:{}\n用时:{} 秒".format(cal_(150000), time.process_time()))
|
|