[英]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.