24小时热门版块排行榜    

查看: 1243  |  回复: 4
本帖产生 2 个 程序强帖 ,点击这里进行查看

wangww2011

木虫 (著名写手)

[交流] Project Euler 47 欧拉工程 47 题 已有3人参与

前两个连续拥有两个素数因子的数是:
14 = 2 * 7
15 = 3 * 5

前三个连续拥有三个素数因子的数是:
644 = 2^2 * 7 * 23
645 = 3 * 5 * 43
646 = 2 * 17 * 19.

请找到前四个连续拥有四个素数因子的数,这四个数中的第一个数是多少?
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tieer

木虫 (正式写手)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
余泽成(金币+3, 程序强帖+1): 欢迎参与讨论! 2011-09-07 22:03:57
还是没人上答案啊,那就上我的超慢版吧,1241s,
CODE:
# -*- coding: cp936 -*-
#Project Euler 47 欧拉工程 47 题
#前四个连续的拥有四个素数因子的数,这四个数中的第一个数是多少?
from math import sqrt
def isprime(p):                    #验证素数,素数则返回素数本身,合数则返回False
    k=1
    for i in xrange(2,int(sqrt(p))+1):
        if p%i==0:
            k=0
            return False
            break
    if k:
        return p
def istheresult(n,m=0):
    actor=[i for i in xrange(3,n+1,2) if n%i==0]   #奇约数列表
    if n%2==0:
        actor.append(2)
    primelist=[i for i in actor if isprime(i)]     #约数中的素数
    if len(primelist)==4:
        if m:print primelist
        return True     
number=647
while True:
    if istheresult(number)and istheresult(number+1)and istheresult(number+2) and istheresult(number+3):
        print number,istheresult(number,1)
        print number+1,istheresult(number+1,1)
        print number+2,istheresult(number+2,1)
        print number+3,istheresult(number+3,1)
        break
    else:
        number+=1

答案:
134043 [3, 7, 13, 491]
134044 [23, 31, 47, 2]
134045 [5, 17, 19, 83]
134046 [3, 11, 677, 2]

[ Last edited by tieer on 2011-9-7 at 20:56 ]
思考,让这个世界更有趣。
2楼2011-09-07 20:30:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangww2011

木虫 (著名写手)

★ ★ ★
余泽成(金币+3, 程序强帖+1): 辛苦! 2011-09-07 22:04:18
我也贴出平庸版本吧
CODE:
644
134043

CODE:
#!/usr/bin/env python

from math import sqrt

def primeN(n):
    t=[n]
    while True:
        for i in range(2,int(sqrt(t[0])+1)):
            if t[0]%i==0:
                t.append(i)
                t[0]=t[0]/i
                break
        else:
            break
    return len(set(t))


def euler47(num):
    n=1
    while True:
        for i in range(num):
            if primeN(n+i)!=num:
                break
        else:
            break
        n+=1
    return n
        

if __name__ == "__main__":
    print euler47(3)
    print euler47(4)

还有一个经典解法为(看到的):
CODE:
n=200000
factors=[0]*n

for i in range(2,n):
    if factors[i] == 0 :
        for j in range(2*i,n,i):
            factors[j] += 1


for i in range(2,n):
    if factors[i:i+4]==4*[4]:
        print i

[ Last edited by wangww2011 on 2011-9-7 at 23:07 ]
3楼2011-09-07 21:44:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
jjdg(金币+2): 感谢参与 2011-09-08 10:06:50
matlab
CODE:
% ans =
%       134043
function result = euler47()
tic;
result = 644;
while 1
    result = result+1;
    if length(unique(factor(result)))==4 && ...
            length(unique(factor(result+1)))==4 && ...
            length(unique(factor(result+2)))==4 && ...
            length(unique(factor(result+3)))==4
        break;
    end
end
toc;
end

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
4楼2011-09-08 01:09:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

chyanog

金虫 (小有名气)


小木虫: 金币+0.5, 给个红包,谢谢回帖
Mathematica做Project euler优势更大,
楼上的matlab代码运行了40s,mathematica版的1.4s
Project Euler 47 欧拉工程 47 题
CODE:
(*method1*)
Catch@Do[
   If[
    Length@FactorInteger[i] == 4 &&
     Length@FactorInteger[i + 1] == 4 &&
     Length@FactorInteger[i + 2] == 4 &&
     Length@FactorInteger[i + 3] == 4, Throw@i],
   {i, 10^6}] // AbsoluteTiming

(*method2*)
i = 1;
NestWhile[Length@FactorInteger[i++] != 4 &, , Or, 4]; // AbsoluteTiming
i - 4

5楼2013-09-15 18:32:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 wangww2011 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见