summaryrefslogtreecommitdiff
path: root/065.c
blob: 94c17fd97a08154da8c61dd737f338225f7ae5e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <gmp.h>
#include <stdio.h>

#define limit 100

unsigned int start = 2;
unsigned int factors[limit-1];

int main(void)
{
	int pos, k=1, sum;
	mpz_t numerator, denominator;

	for(pos=0; pos<limit-1; pos++)
	{
		if(pos % 3 == 1)
			factors[pos] = 2*(k++);
		else
			factors[pos] = 1;
	}

	mpz_init_set_ui(numerator, 1);
	mpz_init_set_ui(denominator, factors[limit-2]);
	for(pos=limit-3; pos>=0; pos--)
	{
		mpz_addmul_ui(numerator, denominator, factors[pos]); // numerator += denominator * factors[pos]
		mpz_swap(numerator, denominator);
	}

	mpz_addmul_ui(numerator, denominator, start); // numerator += denominator * start

	sum = 0;
	while(mpz_cmp_ui(numerator, 0) > 0)
		sum += mpz_fdiv_q_ui(numerator, numerator, 10);

	printf("%li\n", sum);

	return 0;
}