#include <stdio.h>
#define ITERACIONS 10

float factorial(int n);
float potencia(float a, int b);
float sum_inv_i_fact(int iteracions);
float e_elevat_x(int x, int iteracions);

main() {
	int x, n;
        printf("Calcul aproximat de 'e'\n");
        printf("Introdueix 'N' i calcularé el sumatori de 1/i! per i de 0 fins a N:\n");
        scanf("%d", &n);
        printf("SUM(1/i!) de 0 fins a %d = %f\n", n, sum_inv_i_fact(n));
        printf("e=2.71828182845904523536028747135266249775724709369995...\n\n");

        printf("Introdueix un numero 'x' i calcularé una aproximació de e^x: ");
        scanf("%d", &x);
        printf("e^%d = %f\n", x, e_elevat_x(x, ITERACIONS));
}

float sum_inv_i_fact(int iteracions) {
        int i;
        float n = 0;
        for(i=0;i<iteracions;i++) {
                n = n + 1/(float)factorial(i);
                printf("\tSUM(1/i!) = %f (iteracio %d)\n", n, i);
        }
        return n;
}

float e_elevat_x(int x, int iteracions) {
	int i;
	float n = 0;
	for(i=0;i<iteracions;i++) {
		n = n + potencia(x,i)/factorial(i);
		// La division no es entera porque potencia() devuelve un float
		printf("\te^%d = %f (iteracio %d)\n", x, n, i);
	}
	return n;
}

float factorial(int n) {
	int i;
	float res = 1;
	for(i=1;i<=n;i++) {
		res = res * i;
	}
	return res;
}

float potencia(float a, int b) {
	int i;
	float res = 1;
	for(i=1;i<=b;i++) {
		res = res * a;
	}
	return res;
}

