Почему я не могу правильно напечатать 47-е число Фибоначчи?

Я использую 64-битную операционную систему, тогда я также не могу правильно напечатать 46-е число Фибоначчи, которое меньше 4 миллиардов.

#include<cs50.h>
#include<stdio.h>

int main(void)
{  

    unsigned int n=50;
    int array[n];
    array[0]=0;
    array[1]=1;
    printf("%i\n",array[0]);
    printf("%i\n",array[1]);
    for(int i=2;i<n;i++)
    {
        array[i]=array[i-1]+array[i-2];
        printf("%i\n",array[i]);
    }

person himanshu jhamb    schedule 11.07.2016    source источник
comment
@kaylum unsigned int по-прежнему выходит за пределы диапазона на 49-м элементе.   -  person Rishikesh Raje    schedule 11.07.2016
comment
@RishikeshRaje Да, я был буквально, потому что вопрос говорит: «Почему я не могу напечатать 47-е число». Внесение этого изменения позволит правильно распечатать 47-й номер. И OP специально упомянул 4 миллиарда, что, по-видимому, означает, что OP знает о границах 32-битного числа и, следовательно, может ожидать переполнения, как только оно преодолеет это число, но не раньше.   -  person kaylum    schedule 11.07.2016
comment
@Kuldeep1007tanwar Нет, это не так. Это массив переменной длины (VLA). Он был в стандарте C с C99 (хотя стал необязательным в C11).   -  person kaylum    schedule 11.07.2016
comment
о, извините за ошибку, я неправильно понял эту концепцию: -void temp_arr (const int array_size) { int temp_arr[array_size]; }   -  person tryKuldeepTanwar    schedule 11.07.2016
comment
это приведет к ошибке: - array_size должен быть постоянным значением.   -  person tryKuldeepTanwar    schedule 11.07.2016


Ответы (4)


Вы должны использовать long long в качестве типа данных массива. потому что вы собираетесь хранить числа за пределами диапазона целых чисел (от -2 147 483 648 до 2 147 483 647). И объявление int i должно быть перед циклом for.

#include<stdio.h>

int main(void)
{

    int n=50;
    long long array[n];
    array[0]=0;
    array[1]=1;
    printf("%lli\n",array[0]);
    printf("%lli\n",array[1]);
    int i;
    for(i=2;i<n;i++)
    {
        array[i]=array[i-1]+array[i-2];
        printf("%lli\n",array[i]);
    }
}
person dulaj sanjaya    schedule 11.07.2016
comment
И объявление int i должно быть перед циклом for. --› Начиная с C99, for(int i=2;i<n;i++) в порядке, long long тогда тоже был стандартизирован. - person chux - Reinstate Monica; 11.07.2016

Я не могу правильно напечатать 46-е число Фибоначчи, которое меньше 4 миллиардов.

Скорее всего, вы выходите за пределы диапазона целого числа, которое находится в диапазоне от -4294967296 до 4294967295.

Изменить int array[n]; на long long array[n];

Кроме того, printf следует изменить с %i на %lli.

Редактировать: при запуске чисел вы получаете ожидаемое значение F (48) как 4807526976, которое выходит за пределы диапазона целого числа.

person Rishikesh Raje    schedule 11.07.2016
comment
Диапазон 32-битного числа со знаком составляет от -2 147 483 648 до 2 147 483 647. - person user3386109; 11.07.2016

Используя систему подсчета Ришикеша Радже (т.е. 1-й Фибоначчи равен 1), где F (48) равно 4807526976, вы не смогли получить F (47) 2971215073, потому что, как прокомментировал @kaylum, вы использовали массив целых чисел со знаком для хранения своих значений который вам нужно изменить на неподписанный, а также изменить оператор printf для печати без знака. Это позволит вам достичь предела 32-битной арифметики:

#include <stdio.h>

#define LIMIT (50)

int main(void) {
    unsigned int array[LIMIT] = {0, 1};

    printf("%u\n", array[0]);
    printf("%u\n", array[1]);

    for (size_t i = 2; i < LIMIT; i++)
    {
        array[i] = array[i - 1] + array[i - 2];
        printf("%u\n", array[i]);
    }

    return 0;
}

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

person cdlane    schedule 11.07.2016

Либо используйте беззнаковый целочисленный массив, либо для более высоких значений используйте беззнаковый длинный длинный длинный массив, но вам не нужен массив для печати ряда фибоначчи, вы можете просто сделать это: -

void main()
{
  unsigned long long i=1, num1=1, num2=0;
  printf("1 \n");
  for(i; i<100 ; i++)
   {
     num1=num1+num2;
     num2=num1-num2;
     printf("%lli \n", num1);
   }
  getch();
 }
person tryKuldeepTanwar    schedule 11.07.2016