Submission

Status:
PPPPPPPPPP

Score: 100

User: kami

Problemset: อนุกรม

Language: cpp

Time: 0.001 second

Submitted On: 2024-10-16 23:47:12

#include <stdio.h>
#define MAX 100

void add(int fib1[], int fib2[], int res[], int len1, int len2, int *reslen){
    int carry = 0;
    int maxlen = len1 > len2 ? len1 : len2;

    for(int i = 0; i < maxlen; i++){
        int d1 = i < len1 ? fib1[i] : 0;
        int d2 = i < len2 ? fib2[i] : 0;

        int sum = d1 + d2 + carry;
        res[i] = sum%10;
        carry = sum/10;
    }

    if(carry > 0){
        res[maxlen++] = carry;
    }
    *reslen = maxlen;
}

void copy_array(int source[], int dest[], int len){
    for(int i = 0; i < len; i++){
        dest[i] = source[i];
    }
}

void print(int f[], int len){
    for(int i = len - 1; i >= 0; i--){
        printf("%d",f[i]);
    }
}

void fib(int n){
    int fib1[MAX] = {};
    int fib2[MAX] = {};
    int res[MAX] = {};

    fib1[0] = 1;
    fib2[0] = 1;

    int len1 = 1, len2 = 1, reslen = 1;

    if(n <= 2){
        printf("1");
        return;
    }

    for(int i = 3; i <= n; i++){
        add(fib1, fib2, res, len1, len2, &reslen);

        copy_array(fib2, fib1, len2);
        len1 = len2;
        copy_array(res, fib2, reslen);
        len2 = reslen;

        if(i == n){
            print(res, reslen);
        }
    }
}

int main(){
    int n;
    scanf("%d",&n);
    fib(n);
}