鱼C论坛

 找回密码
 立即注册
查看: 700|回复: 7

[活动专区] 鱼C论坛Python精英挑战赛(第三季05期)评比结果

[复制链接]
最佳答案
65 
发表于 2017-10-11 08:57:57 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 jerryxjr1220 于 2017-10-11 09:06 编辑

本期挑战赛只有gunjang答题。

gunjang的程序虽然用时比较长,但是结果正确,评选为最终获胜者!

并且gunjang在本季挑战赛中获胜2场,小剑剑和小锟分别都获胜1场。所以gunjang赢得本季精英挑战赛的最终擂主!额外奖励20荣誉值!

本次挑战赛竞猜获胜的是:
新手·ing
舍生取义
银色的色
Teagle
gunjang
Wesleyz
ttyhtg
fhrv
李白-千年之狐
kkmice
请在本帖回复,领取奖励5鱼币。

本期押宝没有获胜者,奖金10鱼币将累积到下一次押宝竞猜中。

有请@小甲鱼 老师颁奖,总共奖励gunjang 105鱼币和20荣誉值,恭喜gunjang!

鱼C论坛Python精英挑战赛第三季全部结束,感谢大家的参与!

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
SixPy + 5 + 5 + 5 完结,撒花~

查看全部评分

本帖被以下淘专辑推荐:

最佳答案
65 
 楼主| 发表于 2017-10-11 09:02:31 | 显示全部楼层
贴一下我的解答,递归方法,差不多30多秒:
  1. import numpy as np
  2. def sum_perfect_primes(limit):
  3.    def is_perfect(n):
  4.       n = str(n)
  5.       if len(n)<2: return False
  6.       for i in range(len(n)-1,0,-1):
  7.          if primes[int(n[:i])] and n[i:]:
  8.                  if primes[int(n[i:])]:
  9.                          return True  
  10.                  else:
  11.                          if is_perfect(n[i:]):
  12.                                  return True

  13.    primes = np.ones(limit, dtype=np.bool)
  14.    for i in range(2,int(limit**0.5+1)):
  15.       if primes[i]: primes[i*i::i] = False
  16.    primes[0], primes[1] = False, False
  17.    plist = np.nonzero(primes)[0][2:]
  18.    c = 0
  19.    for p in plist:
  20.       if is_perfect(p):
  21. #        print(p, end=' ')
  22.          c += p
  23.    return c
  24. print(sum_perfect_primes(10**8)) #122975378089761
复制代码
最佳答案
39 
发表于 2017-10-11 09:22:19 From FishC Mobile | 显示全部楼层
学习一下

评分

参与人数 1鱼币 +5 收起 理由
jerryxjr1220 + 5 竞猜奖励

查看全部评分

最佳答案
1 
发表于 2017-10-11 13:48:44 | 显示全部楼层
jerryxjr1220 发表于 2017-10-11 09:02
贴一下我的解答,递归方法,差不多30多秒:

厉害,筛法生产素数,再判断是否是pp
我的正好倒过来,素数组合成pp
最佳答案
333 
发表于 2017-10-11 17:51:14 | 显示全部楼层
支持支持

评分

参与人数 1鱼币 +5 收起 理由
jerryxjr1220 + 5 竞猜奖励

查看全部评分

最佳答案
0 
发表于 2017-10-11 20:25:12 | 显示全部楼层
看看,

评分

参与人数 1鱼币 +5 收起 理由
jerryxjr1220 + 5 竞猜奖励

查看全部评分

最佳答案
16 
发表于 2017-10-11 21:57:08 From FishC Mobile | 显示全部楼层
恭喜恭喜
最佳答案
1 
发表于 2017-10-13 15:14:45 | 显示全部楼层
本帖最后由 gunjang 于 2017-10-13 15:18 编辑

@jerryxjr1220
虽然已经评比结束了,但是借鉴兄的素数筛法思路,优化到60s
感觉组合算法还有优化空间,有很多重复~~~
感觉numpy使用的好,优化效率很高,同样的sum,自己迭代13s,python的sum溢出,np.sum只要0.14s,估计这就是解释型语言和编译语言的差距,百倍
  1. #http://bbs.fishc.com/forum.php?mod=viewthread&tid=97298
  2. import time
  3. import numpy as np

  4. st = time.time()

  5. def genPerfectPrimes():
  6.         primes = np.ones(10**8, dtype=np.bool)
  7.         for i in range(2, int((10**8)**0.5)+1):
  8.                 if primes[i]: primes[i*i::i] = False
  9.         primes[0], primes[1] = False, False
  10.         print('generate primes(<10billion) cost %ss' %(time.time()-st)) #2.8s

  11.         combprimes = primes.copy() # one or more primes
  12.         pprimes = np.zeros(10**8, dtype=np.bool)

  13.         cplist = [[] for i in range(9)]
  14.         cplist[1] = [2,3,5,7]
  15.         for digitno in range(2, 8+1):
  16.                 t1 = time.time()
  17.                 for currdigitno in range(1, digitno):
  18.                         currlist = cplist[currdigitno]
  19.                         for nextdigitno in range(1, digitno-currdigitno+1):
  20.                                 nextlist = cplist[nextdigitno]
  21.                                 currmul = 10**(digitno-currdigitno)
  22.                                 for curr in currlist:
  23.                                         curr *= currmul
  24.                                         for nt in nextlist:
  25.                                                 num = curr + nt
  26.                                                 combprimes[num] = True
  27.                                                 if primes[num]:
  28.                                                         pprimes[num] = True
  29.                 if digitno != 8:
  30.                         cplist[digitno] = np.nonzero(combprimes[10**(digitno-1):10**digitno])[0]+10**(digitno-1)
  31.                
  32.                 print('DigitNo=%d cost %ss' %(digitno, time.time()-t1))#8 cost 57s
  33.         t1 = time.time()
  34.         r = np.nonzero(pprimes)[0].astype(np.int64).sum() #must astype, use sum(...) may #overflow encountered in int_scalars
  35.         print('calculte sum cost %ss' %(time.time()-t1)) #13s

  36.         return r

  37. #23419 when <10000
  38. print(genPerfectPrimes()) #122975378089761 count is 2409775
  39. print(time.time()-st) #545s => 61s
复制代码

评分

参与人数 1荣誉 +5 收起 理由
jerryxjr1220 + 5 很欣赏你专研的精神!

查看全部评分

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号 )

GMT+8, 2018-7-17 06:08

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表