Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

Фибоначчиева система счисления, ошибка вывода

Есть код, который переводит целое число x в фиббоначиеву систему счисления по теореме Цекендорфа. Проблема заключается в том, что код работает не для всех вводимых значений.
Пример:
Ввод -> Вывод 3 -> 100 4 -> 101 7 -> 1010 100 -> 1000010100
Тем не менее, при вводе значения 34639092, на выходе мы получаем 101000010100101000000000100010011010, что является неверным ответом. (см. теорему Цекендорфа)
Правильным ответом в данном случае будет 101000010100101000000000100010010010. Фактически, почти идентичный ответ, но здесь отсутствует единица в 4 позиции справа. При отладке кода можно заметить, что эта единица в неверном ответе появляться никаким образом не должна.
Не могу понять причину вывода неверного ответа для такого значения, подозреваю ошибку в коде.
Сам код, язык Си:
#include
int main(int argc, char const *argv[]) { unsigned long x = 0, res = 0, f = 0, bb = 0; long pos = -1; scanf("%lu", &x);
for (f = 0; x > 0; f = 0, pos = -1) { for (int k = 1, n = 1; k < (x+1); n += k, k = n-k) { f = k; pos++; }
if(pos > bb) bb = (pos - 1); x -= f; res |= 1 << (pos-1); }
for (int i = bb; i >= 0; i--) { if(res & (1 << i)) printf("%d", 1); else printf("%d", 0); }
printf("
"); return 0; }


Ответ

Проблема обнаружена и решена.
Строку
res |= 1 << (pos-1);
Нужно заменить на
res |= (unsigned long) 1 << (pos-1);
Аналогично со строкой
if(res & ((unsigned long) 1 << i)) printf("%d", 1);

Комментариев нет:

Отправить комментарий