无法计算低于200万的素数之和

时间:2013-05-20 23:59:31

标签: objective-c boolean sum primes nested-loops

我正在进行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;
}

2 个答案:

答案 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平方根以上的所有数字。解决这些问题,你会很高兴。祝你好运!