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;
}