请问这个编程怎么写,分数可以用数组吗

2/1 3/2 5/3 8/5
从序列第二项开始,每一项的分子等于前一项分子分母之和,每一项的分母等于前一项的分子。编程求这个序列的前20项之和

你可以定义两个数组
第一个数组存每个位置上的分子
第二个数组存每个位置上的分母
然后算一下第二个数组的最小公倍数
然后每个位置分母都调成最小公倍数,分子对应的调整
最后值就等于(所以分子和)/ 最小公倍数

#include <stdio.h>

typedef struct _rational
{
    unsigned long long p;
    unsigned long long q;
} rational;

void swap(unsigned long long *a, unsigned long long *b)
{
    unsigned long long t = *a;
    *a = *b;
    *b = t;
}

unsigned long long gcd(unsigned long long a, unsigned long long b)
{
    if (a > b)
        swap(&a, &b);
    unsigned long long r = b % a;
    if (r == 0)
        return a;
    return gcd(r, a);
}

void simplify(rational *r)
{
    unsigned long long d = gcd(r->p, r->q);
    r->p /= d;
    r->q /= d;
}

void add(rational *r1, const rational *r2)
{
    unsigned long long q = r1->q * r2->q;
    unsigned long long p = r1->p * r2->q + r1->q * r2->p;
    r1->p = p;
    r1->q = q;
    simplify(r1);
}

int main()
{
    rational s = {0, 1}, r = {2, 1};
    for (unsigned long long i = 1; i <= 20; i++)
    {
        add(&s, &r);
        unsigned long long p = r.p + r.q;
        unsigned long long q = r.p;
        r.p = p;
        r.q = q;
    }
    printf("%lld/%lld", s.p, s.q);
    return 0;
}