2014-05-02 2 views
0

Я пытаюсь решить задачу 10 в Project Euler, и пока я думал, что у меня это есть, его ответ на мой вопрос неверен. Вопрос заключается в следующем:Project Euler # 10 in Objective C

сумма простых чисел ниже 10 составляет 2 + 3 + 5 + 7 = 17. Найти сумму всех простых чисел меньше двух миллионов.

И мой код:

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