Найти сумму всех четных членов в последовательности, которые не превышают четырех миллионов - PullRequest
3 голосов
/ 03 октября 2010

Каждый новый термин в последовательности Фибоначчи генерируется путем добавления двух предыдущих терминов.Начиная с 1 и 2, первые 10 терминов будут:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... Я сделал программу, но мой ответне соответствует.

#include<stdio.h>
int main()
{
 long unsigned int i,sum=0,x=1,y=2,num;
 for(i=0;i<4000000;i++)
 {
  num=x+y;
  if(i%2==0)
   sum+=num;
  x=y;
  y=num;
 }
 printf("%lu\n",sum);
 getchar();
 return 0;
}

Ответы [ 5 ]

3 голосов
/ 03 октября 2010

Я вижу три проблемы:

  • Вы должны начать с x = 1, y = 1, так как в противном случае вы пропускаете первое четное число Фибоначчи;
  • Ваше условие цикла должно быть (x + y) <= 4000000
  • Вы должны проверить num на четность, а не i.

(После этих изменений должно быть очевидно, что вы можете полностью пропустить i и, следовательно, заменить цикл for на цикл while)

1 голос
/ 03 октября 2010

В вашем коде вы найдете сумму чисел Фибоначчи с четным индексом, а не сами числа +, вы ищите первые 4000000 чисел в последовательности, а не числа со значениями <= 4000000. Ваш код должен выглядеть примерно так: </p>

while ( y < 4000000){
...
if (y %2 == 0)
    sum += y;
} 
0 голосов
/ 03 октября 2010

печать num внутри цикла, для отладки

 for(i=0;i<4000000;i++)
 {
  num=x+y;
  printf("num is %lu\n", num); /* DEBUGGING */
  if(i%2==0)
   sum+=num;
  x=y;
  y=num;
 }
0 голосов
/ 03 октября 2010

Я сделал минимальный набор исправлений и теперь получил правильный ответ.Прочитав это (в конце концов, это было ваше, вы можете узнать больше), чем я, рассуждая об этом ...

#include <stdio.h>

#define LIMIT (4 * 1000 * 1000)

int main() {
  long unsigned int sum = 0, x = 1, y = 2, num;

  while (x <= LIMIT) {
    if ((x & 1) == 0 && x <= LIMIT)
      sum += x;
    num = x + y;
    x = y;
    y = num;
  }
  printf("%lu\n", sum);
  return 0;
}
0 голосов
/ 03 октября 2010

Я думаю, что следующая строка

if(i%2==0)

могла бы быть

if( num % 2 == 0)

Если подумать дальше, я думаю, что на самом деле вам не нужна переменная i.Вместо этого ваш цикл может управляться с помощью num как:

enum { LIMIT = 4 * 1000 * 1000 };
num = x + y;
while( num <= LIMIT ) {
...