2014-05-02 44 views
0

我想解決歐拉項目中的問題10,雖然我認爲我有它,它說我的答案是不正確的。現在的問題是如下:項目歐拉在目標C#10

低於10的素數的總和爲2 + 3 + 5 + 7 = 17。 查找下面2000000所有素數的總和。

而且我的代碼:

int sum; 
@interface Prime : NSObject 
-(BOOL)isPrime:(int)arg1; 
@end 

@implementation Prime 
-(BOOL)isPrime:(int)arg1 { 
    if (arg1 == 1) { 
     NSLog(@"Given 1"); 
     return NO; 
    } 
    for (int i = 2; i < arg1; i++) { 
     if (arg1 % i == 0) { 
      return NO; 
     } 
    } 
    sum += arg1; 
    return YES; 
} 
@end 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
     Prime* primeObject = [[Prime alloc] init]; 
     for (int i = 0; i < 2000000; i++) { 
      [primeObject isPrime:i]; 
     } 
     NSLog(@"Sum of primes is %i", sum); 
    } 

} 

這段代碼輸出「素數總和爲1179908154」的項目歐拉說是不正確。幫幫我?

+0

嘗試初始化'sum' 0 – rmaddy

+1

效率可能不是重點,但對於'(INT I = 2; i Byte

回答

2

問題是總和不適合32位整數。您應該改用long long

+0

這工作,非常感謝你!我不會想到int會太小:p – Phillip

0

只是一個猜測,你應該嘗試:

  • 初始化的變量sum爲0
  • 儘量不要使用像sum一個全局變量,可以從任何地方訪問,在這種情況下做總和在主循環中而不是在isPrime方法中。

也許這會給你正確的答案。

+1

是的,在isPrime:方法中進行求和是非常奇怪的。 – rmaddy

+0

全局變量初始化爲零。 –

+0

@MartinR今天我學到了。謝謝。 –

0

您正在使用int獲取結果,所以它是錯誤的。 我使用long int代替,對於這種情況就足夠了。

這裏是我的代碼,並能正常工作:

int inputNumber = 2000000; 
    long int result = 0; 

    for (int i = 2; i < inputNumber; i++) { 
     BOOL isPrime = YES; 
     for (int j = 2; j <= sqrt(i); j++) { 
      if (i%j==0) { 
       isPrime = NO; 
       break; 
      } 
     } 

     if (isPrime) { 
      result += i; 
     } 
    } 

結果是:142913828922