重写代码以生成包含从2开始的连续素数的所有数字,小于给定数字

时间:2016-08-18 16:40:49

标签: python math

我一直在尝试解决this项目euler问题,并找到了正确的解决方案。然而,我的代码很糟糕。我使用了几个嵌套循环,我希望将它们变成一些更好的函数等。以下是代码的前三个部分,解决问题所需的10个部分中。每个都有一个嵌套循环,虽然时间不是问题我想改进这个代码,但我不知道如何以更简洁的方式实现这个算法。

第n部分所做的是生成小于1e9的所有数字,其仅包含前n个素数(然后将与问题相关的数字添加到集合中)。

我试图举例说明所有素数的指数列表,并递增最外面的非零指数,然后当产品大于1e9时回溯,但是我无法做任何成功的事情。

如果此问题不适合此网站,我可以将其删除。

pseudofortunate=set()

pr=generate_primes(24)




num1=1
while num1<1e9/2:
    num1*=pr[0]
    num2=num1
    while num2<1e9/3:
        num2*=pr[1]
        m=num2+3
        while True:
            if is_prime(m):
                pseudofortunate.add(m-num2)
                break
            m+=2


num1=1
while num1<1e9/2:
    num1*=pr[0]
    num2=num1
    while num2<1e9/3:
        num2*=pr[1]
        num3=num2
        while num3<1e9/5:
            num3*=pr[2]
            m=num3+3
            while True:
                if is_prime(m):
                    pseudofortunate.add(m-num3)
                    break
                m+=2


num1=1
while num1<1e9/2:
    num1*=pr[0]
    num2=num1
    while num2<1e9/3:
        num2*=pr[1]
        num3=num2
        while num3<1e9/5:
            num3*=pr[2]
            num4=num3
            while num4<1e9/7:
                num4*=pr[3]
                m=num4+3

                while True:
                    if is_prime(m):
                        pseudofortunate.add(m-num4)
                        break
                    m+=2

2 个答案:

答案 0 :(得分:0)

这可以找到正确数量的素数&lt; 100.您需要将100更改为变量并更改numPrimes以实际设置主要值,但它可以工作:

int i;
int j;
int numPrimes = 0; 

for (i = 3;  i < 100; i++) {
    for (j = 2; j < (i-1); j++) {
        if ((i % j) == 0) {
            break;
        }
    }
    if (j == (i-1)) {
        ++numPrimes;
    }
}
// now add 1 for the value 2
numPrimes = ++numPrimes;

答案 1 :(得分:0)

好的,所以我通过递归地将嵌套循环作为生成器来解决这个问题。下面是一个更好的代码,可以产生相同的答案。

def loop(n,depth):
    if depth==0:
        num1=1
        while num1<n/2:
            num1*=pr[0]
            yield num1
    else:
        for i in loop(n,depth-1):
            num_depth=i
            while num_depth<n/pr[depth]:
                num_depth*=pr[depth]
                yield num_depth

def amicablenums(n=1e9):
    p=set()
    for i in range(len(pr)):
        a=set(loop(n,i))
        p=p|a
    return p


def pseudofortunate(n):
    m=n+3
    while True:
        if is_prime(m):
            return m-n
        m+=2
pr=generate_primes(24)
pseudofortunates=set()      
for i in amicablenums():
    pseudofortunates.add(pseudofortunate(i))
print sum(pseudofortunates)