我一直在尝试解决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
答案 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)