繁体   English   中英

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

[英]Rewriting code to generate all numbers containing consecutive primes starting at two, less than a given number

我一直在试图解决这个项目欧拉的问题,并且已经找到了正确的解决方案。 但是我的代码很糟糕。 我使用了几个嵌套循环,希望将它们做成更好的功能或类似的功能。 以下是代码的前三个部分,其中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

这可以找到小于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;

好的,我通过将嵌套循环作为生成器递归地完成了这一工作。 下面是产生更好答案的更好的代码。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM