我正在进行Euler方法项目,以找出低于200万的素数之和,我正在努力。这是我正在使用的代码。当我计算总和低于10且总和低于50时,我得到了正确的值,但是我在计算低于200万项目的总和时,欧拉说我的解决方案是错误的。有什么想法吗?
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
int p = 2, d, total;
BOOL isPrime;
total = 0;
NSLog(@"%i ", p);
for ( p = 3; p < 2e6; p += 2){
isPrime = YES;
for ( d = 3; isPrime == YES && d < p; d += 2)
if ( p % d == 0)
isPrime = NO;
if (isPrime == YES){
NSLog(@"%i ", p);
total += p ;}
}
NSLog(@"total = %i", total + 2);
}
return 0;
}
答案 0 :(得分:0)
此函数使用Eratosthenes的Sieve对小于 n 的素数求和:
function sumPrimes(n)
sum := 0
sieve := makeArray(2..n, True)
for p from 2 to n step 1
if sieve[p]
sum := sum + p
for i from p * p to n step p
sieve[i] := False
return sum
我将留给您使用合适的数据类型转换为Objective-C。对于 n = 2000000,这应该在一两秒钟内运行。
答案 1 :(得分:0)
有几个错误。第一个是你满溢。使用long而不是int。第二件事就是性能提升。从p&lt;更改你的for循环2e6,至p * p <= 2e6。这样就可以排除2e6平方根以上的所有数字。解决这些问题,你会很高兴。祝你好运!