0

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;
}
4

2 に答える 2

0

いくつか間違いがあります。1つ目は、あなたがあふれていることです。int の代わりに long を使用します。2 つ目は、パフォーマンスの向上です。for ループを p < 2e6 から p*p <= 2e6 に変更します。このようにして、2e6 の平方根を超えるすべての数値を除外します。これらの問題を修正すれば、準備万端です。幸運を!

于 2013-06-06T04:57:45.250 に答える
0

この関数は、エラトステネスの篩を使用して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 ~ 2 秒で実行されます

于 2013-05-21T01:42:27.017 に答える