鱼C论坛

 找回密码
 立即注册
查看: 3629|回复: 15

[技术交流] 鱼C论坛Python精英挑战赛(第三季05期)

[复制链接]
发表于 2017-9-30 22:36:40 | 显示全部楼层 |阅读模式
本帖最后由 jerryxjr1220 于 2017-10-11 08:59 编辑

第三届鱼C论坛精英挑战赛开赛咯!为了增加趣味性,本届比赛增加了“新玩法”-- “押宝玩法”,“竞猜玩法”和“擂主玩法”。

规则:

1. 押宝玩法:进入“押宝”竞猜帖,购买主题(5鱼币)参与“押宝”,最终“押宝”获胜者将平分奖池的奖金并额外获取10鱼币奖励。猜错者将不返还“押宝”的鱼币。若本届比赛无人“押宝”成功,奖金将累计到下次比赛。

2. 竞猜玩法:直接在比赛帖的下方进行投票,凡事“竞赛”获胜者,将奖励5鱼币。竞猜无门槛,人人都可以参与。竞猜以后,请在本帖留个言,方便领取奖励。

3. 擂主玩法:上一期挑战成功的鱼油成为挑战赛的擂主,擂主有优先权提议下一期的赛题,一届挑战赛共分5期,同一届中当擂主最长的鱼油有额外奖励。

本期擂主:无

本期赛题的题型:算法题

由于上期题目偏难,这期降低难度。

题目:完美质数

素数又称质数。指一个大于1的自然数,除了1和此整数自身外,不能被其他自然数整除的数。

我们定义:如果一个素数是完美的素数,当且仅当它是由两个或两个以上的质数拼接而成的。

例如,23是质数,同时2和3也都是质数,所以23就是完美质数;而29是由2和9拼接而成的,但是9不是质数,所以29不是完美质数; 而293可以由29和3构成,29和3都是质数,所以293也是完美质数。

特别地,如果质数中间包含0,0可以忽略。即307可以看作由3和7构成,忽略0。

已知:1000以内的完美质数有“23 37 53 73 113 137 173 193 197 211 223 227 229 233 241 257 271 277 283 293 307 311 313 317 331 337 347 353 359 367 373 379 383 389 397 433 503 523 541 547 557 571 577 593 613 617 673 677 719 727 733 743 757 761 773 797 977”总和是 23419。

求1亿(10**8)以内所有完美质数的和。

def sum_perfect_primes(limit):
    "Your code here"
    return the_sum_of_the_perfect_primes_within_the_limit


要求:

程序运算正确,执行效率最高的即为获胜者。

竞猜:
正确答题的参赛者的人数是奇数还是偶数?

比赛截止日期:10月8日24时,竞猜和押宝截止日期为10月7日

由于国庆假期,故延长3天!

国庆节快乐!

@小甲鱼 @冬雪雪冬 @~风介~ @SixPy
单选投票, 共有 15 人参与投票
您所在的用户组没有投票权限

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-30 23:41:52 | 显示全部楼层
我猜是奇数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-3 20:40:54 | 显示全部楼层
精英赛的题目感觉有点不明白,定义:完美素数是由两个或两个以上的质数拼接而成,而29是质数,那为什么含有29的三位数的质数不能是完美素数?

点评

我很赞同!: 5.0
我很赞同!: 5
谢谢指出,包含29的三位质数,例如229和293也是完美质数,229可以由2和29组成,293可以由29和3组成。  发表于 2017-10-4 08:02
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-4 10:05:42 | 显示全部楼层
@冬雪雪冬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-7 23:15:33 | 显示全部楼层

请问227是怎么回事

本帖最后由 gunjang 于 2017-10-7 23:49 编辑

正在赶工。。。
发现227是2 2 7组成的,本身也是素数,但是却不在示例的1000内完美素数表内
同理227 257 277 557 727 757

点评

我很赞同!: 5.0
已经纠正,谢谢指出!  发表于 2017-10-8 10:44
我很赞同!: 5
227应该是算的,我的程序也有点问题,再调试一下。  发表于 2017-10-8 07:54
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-10-8 06:54:39 From FishC Mobile | 显示全部楼层
gunjang 发表于 2017-10-7 23:15
正在赶工。。。
发现227是2 2 7组成的,本身也是素数,但是却不在示例的1000内完美素数表内
同理227 257  ...

227应该算的,可能我的程序也有点问题,漏掉了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-8 12:32:15 | 显示全部楼层
#122975378089761
运行10分钟,不知道对不对,应该还有优化的空间
#http://bbs.fishc.com/forum.php?mod=viewthread&tid=97298
from math import sqrt
import time

st = time.time()
p10bindex = [0]

def generateprime10b():
        r =[2, 3, 5, 7]
        currbit = 10
        for i in range(12, 10**7, 6): #10^7
                i1 = i - 1
                si = int(sqrt(i1))
                for p in r:
                        if (p > si) or (i1 % p) == 0:
                                break
                if i1 % p != 0:
                        r.append(i1)
                        if i1 > currbit:
                                p10bindex.append(len(r)-1)
                                currbit *= 10

                i1 = i + 1
                si = int(sqrt(i1))
                for p in r:
                        if (p > si) or (i1 % p) == 0:
                                break
                if i1 % p != 0:
                        r.append(i1)
                        if i1 > currbit:
                                p10bindex.append(len(r)-1)
                                currbit *= 10

        p10bindex.append(len(r))                        
        return r

def isPrime(n): 
        if n < 10**7:
                st = 0
                ed = len(primes10b)-1
                while st <= ed:
                        mid = (st+ed)//2
                        if primes10b[mid] > n:
                                ed = mid -1
                        elif primes10b[mid] < n:
                                st = mid + 1
                        else:
                                return True
                return False
        sn = int(sqrt(n))
        for p in primes10b:
                if p > sn:
                        return True
                if n%p == 0:
                        return False

def genPerfectPrimes():
        rsum = 0
        pplist = [primes10b[:p10bindex[1]]] #one digit primes
        for digitno in range(2, 8+1): #8+1
                r = []
                currpplist = []
                for currdigitno in range(1, digitno):
                        currlist = pplist[currdigitno-1]
                        for nextdigitno in range(1, digitno-currdigitno+1):
                                nextlist = pplist[nextdigitno-1]
                                currmul = 10**(digitno-currdigitno)
                                for nt in nextlist:
                                        if (nt%5 == 0) or (nt%2 == 0):
                                                continue
                                        for curr in currlist:
                                                num = curr * currmul + nt
                                                if isPrime(num): 
                                                        r.append(num)
                                                if digitno != 8:
                                                        currpplist.append(num)
                if digitno != 8:
                        currpplist.extend(primes10b[p10bindex[digitno-1]:p10bindex[digitno]])
                        currpplist = list(set(currpplist)) #remove Duplicate
                        pplist.append(currpplist)
                rsum += sum(set(r))
                print('cost %ss' %(time.time()-st))
                print('DigitNo=%d Sum=%d' %(digitno, rsum))
                print('count of Perfect Primes: %d'%(len(currpplist)))

        return rsum

primes10b = generateprime10b() #21s
print('generate primes(<10billion) cost %ss' %(time.time()-st))
r = genPerfectPrimes()
print(r) #122975378089761
#digitno=7 ,sum is 1373257989644,cost 149s
print(time.time()-st) #545s 

点评

不,我坚决不同意楼主的看法!: 5.0
我列了一下你程序里筛选出来的10000以下的完美质数,比如8221,这个你是怎么判断的?  发表于 2017-10-9 09:11
不,我坚决不同意楼主的看法!: 5
10000以内的答案你的就和我不一样了,你的是2057467,我的是1682823.  发表于 2017-10-9 08:58

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
jerryxjr1220 + 5 + 5 + 5 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-9 11:42:38 | 显示全部楼层
本帖最后由 gunjang 于 2017-10-9 11:50 编辑
gunjang 发表于 2017-10-8 12:32
#122975378089761
运行10分钟,不知道对不对,应该还有优化的空间


抱歉没发现有8221,重新导出4位数的pp
@jerryxjr1220
pp4 = [2053, 4111, 6173, 4127, 4129, 2083, 4133, 2089, 8233, 8237, 6197, 4153, 4157, 4159, 2113, 4177, 8273, 2131, 2137, 8293, 8297, 8311, 4217, 8317, 2179, 8329, 2203, 2207, 8353, 2213, 6317, 8377, 2237, 2239, 2243, 8389, 2251, 2267, 2269, 2273, 4327, 2281, 4337, 2293, 2297, 4357, 2311, 4373, 2333, 2341, 2347, 4397, 2357, 2371, 2377, 6473, 2383, 2389, 2393, 8537, 2417, 8573, 2437, 4493, 8597, 2467, 2473, 2477, 2503, 2521, 2531, 2543, 2557, 2579, 4637, 2593, 6703, 2617, 6719, 4673, 2633, 6733, 6737, 2647, 4703, 2659, 6761, 4723, 2677, 4729, 2683, 6779, 4733, 2693, 8837, 2707, 2711, 4759, 2713, 2719, 2729, 2731, 4783, 6833, 2741, 4789, 4793, 2753, 2767, 2777, 8923, 8929, 2789, 8933, 2797, 8941, 6917, 8971, 4877, 2833, 2837, 2857, 2887, 2897, 2903, 7013, 2917, 7019, 2927, 7027, 4993, 7043, 2953, 5003, 2957, 7057, 5011, 2971, 5023, 7079, 7103, 3011, 5059, 7109, 3019, 3023, 5077, 7127, 7129, 3037, 3041, 5101, 7151, 5107, 3061, 1013, 7159, 5113, 3067, 3079, 7177, 1033, 3083, 3089, 7193, 3109, 7207, 7211, 7213, 5167, 3119, 7219, 5179, 7229, 3137, 7237, 1093, 1097, 7243, 5197, 9293, 7247, 1103, 7253, 3163, 1117, 3167, 1123, 1129, 5227, 3181, 5231, 5233, 7283, 5237, 3191, 7297, 1153, 3203, 7307, 5261, 3217, 1171, 5273, 3229, 5279, 5281, 9377, 7331, 7333, 5297, 3251, 3253, 7349, 5303, 3257, 3259, 9413, 3271, 5323, 5333, 7393, 5347, 3307, 3313, 3319, 7417, 3323, 1277, 3329, 9473, 3331, 7433, 3343, 3347, 1303, 1307, 3359, 3361, 7457, 5413, 1319, 5417, 3371, 5419, 3373, 1327, 7477, 5431, 3389, 5437, 7487, 9533, 5443, 5449, 7499, 1361, 7507, 3413, 1367, 7517, 1373, 7523, 5477, 5479, 7529, 3433, 7537, 7541, 3449, 7547, 5503, 3457, 5507, 3461, 7559, 3463, 7561, 3467, 5519, 5521, 7573, 5527, 7577, 5531, 7583, 3491, 7589, 3499, 5557, 7607, 3511, 5563, 3517, 5569, 5573, 3527, 3529, 3533, 9677, 3541, 1493, 3547, 7643, 3557, 3559, 3571, 9719, 7673, 3583, 9733, 3593, 5641, 7691, 5647, 9743, 5653, 3607, 7703, 5659, 3613, 3617, 7717, 9767, 7723, 3631, 7727, 5683, 3643, 7741, 5693, 5701, 7753, 3659, 7757, 5711, 7759, 5717, 3673, 3677, 1637, 5737, 9833, 3691, 5741, 7789, 5743, 7793, 3701, 3709, 3719, 3727, 7823, 5779, 3733, 7829, 5783, 3739, 7853, 3761, 3767, 3769, 1723, 5821, 7873, 3779, 5827, 7877, 1733, 7883, 1741, 5839, 3793, 1747, 3797, 1753, 1759, 5857, 7907, 3821, 3823, 7919, 1777, 9973, 7927, 1783, 3833, 5881, 7933, 1789, 7937, 5897, 3853, 5903, 3863, 5923, 3877, 5927, 3881, 5953, 3907, 3911, 3919, 3929, 3947, 1907, 1913, 3967, 1931, 1933, 8093, 4013, 1973, 8117, 6073, 1979, 1993, 1997, 2003, 2011, 2017, 6113, 2027, 2029, 6131, 6133, 4093, 6143]
is_prime = lambda n: True if n in {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67} else all(False for p in {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67} if pow(p,n-1,n) != 1)
print(len(pp4), sum(pp4)) #428 2034048
for p in pp4:
        if not is_prime(p):
                print(p)
#23419+2034048=2057467
结果显示都是prime呀

点评

我很赞同!: 5.0
我用递归写的话,大概40秒不到就能算完10**8了。前面之所以算错是由于递归返回的条件弄错了。  发表于 2017-10-9 20:56
你最终的结果是正确的,不过程序可以优化一下。  发表于 2017-10-9 20:54
我很赞同!: 5
嗯,你的是对的,是我的程序有问题。  发表于 2017-10-9 20:42
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 14:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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