Есть код, который переводит целое число 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);
Комментариев нет:
Отправить комментарий