|
发表于 2017-8-15 21:40:25
|
显示全部楼层
本帖最后由 夏天和大熊 于 2017-8-15 22:03 编辑
失之毫厘差之千里喽,把判断不满足条件的数直接从列表remove。结果结果差了好多!!代码也写了不够简练,重新改了一遍。参考的小Q的算法。在求杨辉三角中的数时利用对称性以列为单位,只求了一半。
- # 给出卡帕斯三角中前n行中所有不同的数
- def crt_list(n = 3):
- list_nums = [[1 for i in range(n)]]
- list_kap = [1]
- if n%2 :
- temp = n//2
- else:
- temp = n//2 - 1
- for i in range(temp):
- list_deff = list_nums[i]
- list_column = [1]
- for j in range(1, n-i-1):
- num = list_column[-1] + list_deff[j]
- list_column.append(num)
- if num not in list_kap:
- list_kap.append(num)
- list_nums.append(list_column)
- return list_kap
- # 给出i_end以内的素数表
- def crt_pri(i_end):
- mark_pri = [True for i in range(i_end + 1)]
- mark_pri[0], mark_pri[1] = False, False
- for i in range(2, i_end + 1):
- if mark_pri[i] == True:
- for j in range(i + i, i_end + 1, i):
- mark_pri[j] = False
- nums_pri = [i for i,j in enumerate(mark_pri) if j == True]
- return nums_pri
- # 将所给列表中满足squarefree条件的数加起来
- def sum_sqarefree(n = 51):
- list_og = crt_list(n)
- t_start = t.time()
- list_re = []
- list_pri = [i*i for i in crt_pri(int(max(list_og)**0.25) + 1)]
- for each in list_og:
- for i in list_pri:
- if each < i:
- break
- if each%i == 0:
- list_re.append(each)
- break
- t_end = t.time()
- print(t_end - t_start)
- return sum(set(list_og) - set(list_re))
复制代码 |
|