高精度斐波那契

斐波那契数列为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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值