斐波那契数列为1,1,2,3,5......n的最小值为1。
#include <stdio.h>
#include <string.h>
#define MAX_N 1000 //定义斐波那契数列序列最大值
typedef struct {
int len; // 数组长度
int num[MAX_N]; // 存储每一位的数字
} BigInt;
void init(BigInt* a, int x) { // 将a初始化为x
memset(a, 0, sizeof(BigInt));
a->num[0] = x;
a->len = 1;
}
void print(BigInt* a) { // 输出BigInt表示的整数
for (int i = a->len - 1; i >= 0; i--)
printf("%d", a->num[i]);
}
BigInt add(BigInt a, BigInt b) { // 高精度加法
BigInt ans;
memset(&ans, 0, sizeof(ans));
int carry = 0;
for (int i = 0; i < a.len || i < b.len || carry; i++) {
int sum = carry;
if (i < a.len) sum += a.num[i];
if (i < b.len) sum += b.num[i];
ans.num[i] = sum % 10;
carry = sum / 10;
ans.len++;
}
return ans;
}
void fib(int n) { //用于计算n个斐波那契数列数
BigInt a, b, c;
init(&a, 1); // 初始化a=0
init(&b, 1); // 初始化b=1
if (n == 1) {
print(&a); // 输出第1个斐波那契数列数
return;
}
if (n == 2) {
print(&b); // 输出第2个斐波那契数列数
return;
}
for (int i = 3; i <= n; i++) {
c = add(a, b); // 计算c=a+b
a = b; // 更新a=b
b = c; // 更新b=c
}
print(&c); // 输出第n个斐波那契数列数
}
int main() {
int n;
printf("请输入要计算的斐波那契数列的项数:");
scanf("%d", &n);
if (n < 1) {
printf("输入无效!项数必须大于等于1。\n");
return 1;
}
fib(n);
return 0;
}