Что такое сумма четных выражений в Фибоначчи (<4 миллиона)? [Большая путаница с типом данных] - PullRequest
2 голосов
/ 29 октября 2009

Начиная с 1 и 2, первые 10 членов Серии Фибоначчи будут:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Найдите сумму всех четных членов в последовательности, которые не превышают 4 млн.


Теперь у меня появилась идея, как это сделать. Но я запутался в типах данных для хранения таких больших данных. Я получаю странные результаты с int. (

БОЛЬШЕ: Это проект Эйлера, 2-й вопрос. Но я не могу получить это. Я получаю сумасшедшие ценности как ответ. Может кто-нибудь выложить пожалуйста идеальную программу?

РЕДАКТИРОВАТЬ: Вот что я написал для простой печати Фибоначчи на экране. Голый Basic. Моя переменная сходит с ума, даже когда я даю 100 за предел. Мой код неверен?

// Simple Program to print Fibonacci series in Console
#include <stdio.h>
int main() {
    int x=1,y=2,sum=0,limit=0,i=0,temp=0;
    printf("Enter Limit:");
    scanf("%d",&limit);

    if(limit==1)
        printf("%d",x);
    else if(limit>1) {
        printf("%d %d",x,y);
        if (limit>2) {
            while (i<limit-2) {
                temp=y;
                sum=x+y;
                x=temp;
                y=sum;
                printf(" %d",sum);
                i++;
            }
        }
    }      

    printf("\n");
    return 0;
}

РЕШЕНО: На самом деле мне удалось найти решение самостоятельно. Вот моя программа. Это работает.

#include <stdio.h>
int main() {
    int x=1,y=2,sum,limit;     //Here value of first 2 terms have been initialized as 1 and 2
    int evensum=2;             //Since in calculation, we omit 2 which is an even number
    printf("Enter Limit: ");   //Enter limit as 4000000 (4million) to get desired result
    scanf("%d",&limit);
    while( (x+y)<limit ) {
        sum=x+y;
        x=y;
        y=sum;
        if (sum%2==0)
            evensum+=sum;
    }
    printf("%d \n",evensum);
    return 0;
}

Ответы [ 15 ]

0 голосов
/ 31 октября 2009

Ребята, я получил ответ. Я подтвердил результат, и int может с этим справиться. Вот моя программа:

#include <stdio.h>
int main() {
    int x=1,y=2,sum,limit;     //Here value of first 2 terms have been initialized as 1 and 2
    int evensum=2;             //Since in calculation, we omit 2 which is an even number
    printf("Enter Limit: ");   //Enter limit as 4000000 (4million) to get desired result
    scanf("%d",&limit);
    while( (x+y)<limit ) {
        sum=x+y;
        x=y;
        y=sum;
        if (sum%2==0)
            evensum+=sum;
    }
    printf("%d \n",evensum);
    return 0;
}

Спасибо за все ответы и помощь. «Мышление на ногах» на помощь:)

0 голосов
/ 30 октября 2009

Ваша программа печатает F_1 + .. + F_limit, а не F_1 + ... F_n с пределом F_n <, как вы описали. </p>

Проверьте статью в Википедии о числах Фибоначчи и Слоане A000045 : числа Фибоначчи растут в геометрической прогрессии. Проверка этой таблицы F_48 = 4807526976, которая превышает int. F_100 - 354224848179261915075, который наверняка переполняет даже int64_t (хотя ваш стек этого не делает).

0 голосов
/ 29 октября 2009

Одна ошибка, которую вы, вероятно, видите, это неправильное форматирование ваших операторов printf (). Если printf («% d% d»), а затем printf («% d»), числа 3, 5, 8, 13, 21, 34, 55 будут печататься как: 3 5 813 21 3455 что, безусловно, выглядит как забавный вывод с дико неподходящими номерами. Вам нужно еще несколько пробелов или перевод строки: printf ("% d% d \ n"), printf ("% d \ n").

Я также не вижу, где вы на самом деле проверяете только четные условия для внесения в сумму.

0 голосов
/ 29 октября 2009

int достаточно велико для значений в миллионах практически в каждой современной системе, но вы можете использовать long, если вас это беспокоит. Если это все же дает странные результаты, значит, проблема в вашем алгоритме.

0 голосов
/ 29 октября 2009

Использование BigInt .

Опять же, unsigned int хранит значения более 4 миллиардов, поэтому у вас не должно возникнуть никаких проблем даже с "суммой всех чисел Фибоначчи до 4 миллионов" (которая, очевидно, должна быть меньше 8). мил)

...