53 lines
1.0 KiB
C
53 lines
1.0 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <limits.h>
|
|
|
|
int fib(int n) {
|
|
if (n < 0) {
|
|
return -1;
|
|
}
|
|
if (n == 0) return 0;
|
|
if (n == 1) return 1;
|
|
|
|
int a = 0;
|
|
int b = 1;
|
|
int c;
|
|
|
|
for (int i = 2; i <= n; i++) {
|
|
if (b > INT_MAX - a) {
|
|
return INT_MIN;
|
|
}
|
|
c = a + b;
|
|
a = b;
|
|
b = c;
|
|
}
|
|
return b;
|
|
}
|
|
|
|
int main(void) {
|
|
int n;
|
|
printf("Введите целое неотрицательное n: ");
|
|
if (scanf("%d", &n) != 1) {
|
|
fprintf(stderr, "Ошибка ввода: ожидалось целое число.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
int result = fib(n);
|
|
|
|
if (n < 0) {
|
|
fprintf(stderr, "Ошибка: n должно быть неотрицательным.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if (result == INT_MIN) {
|
|
fprintf(stderr, "Ошибка: переполнение при вычислении fib(%d). "
|
|
"Значение фибоначчи слишком велико для типа int.\n", n);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
printf("fib(%d) = %d\n", n, result);
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
|