/*	gauss.c -- Sourcecode unter der GPL, (c) 2003 @ RTC			*/
/*	Programm demonstriert zwei Algorithmen zum Bilden der Summe einer	*/
/*	Reihe und misst die Zeit, die sie zur Ausführung benötigen		*/

#include <stdio.h>
#include <time.h>

#define MAX_N 1000000
#define MAX_I MAX_N/100

/* ---- erster Algorithmus, welcher sequentiell zählt -------------------------	*/
long int summe(long int a[], long int n){
	long int s=0, i;

	for(i=0; i<n; ++i)   //sequentiell die Summe berechnen
		s+=a[i];

	return s;
}

/* ---- zweiter Algorithmus = Gauß-Methode ------------------------------------	*/
long int gauss_summe(long int a[], long int n){
	if(n%2==0)   //wenn die Anzahl der Elemente gerade ist...
		return (n/2 * (a[0]+a[n-1]));
	else
		return ((n-1)/2 * (a[0]+a[n-2]) + a[n-1]);
}


/* ---- main() ----------------------------------------------------------------	*/
int main(void){
	/* für das kleine Demo-Beispiel nehme ich ein statisches Array */
	long int a[MAX_N], n, i, ergebnis;
	clock_t start, ende;

	do{
		printf("Anzahl der Elemente?: ");
		scanf("%ld", &n);
	}while(n<=0 || n>MAX_N);

	/* das Array mit fortlaufenden Zahlen füllen */
	for(i=0; i<n; ++i)
		a[i]=i+1;

	/* ersten Algorithmus MAX_I mal aufrufen; natürlich ist es nicht so fein, 	*/
	/* eine Ausgabe in die Zeitberechnung mit einzubringen, hier geht es		*/
	/* allerdings nicht um Genauigkeit, sondern um die Demonstration eines		*/
	/* Zeitvergleichs und da dieselbe Ausgabe bei beiden Algorithmenaufrufen	*/
	/* stattfindet, kommt es dabei zu keiner Verfälschung!				*/
	start=clock();
	for(i=0; i<MAX_I; ++i){
		printf("\r%6.3f%% bearbeitet...", i/(double)MAX_I*100);
		ergebnis=gauss_summe(a, n);
	}
	ende=clock();
	printf("\rGauß-Summe: %ld, benoetigte Zeit: %6.3f\n", ergebnis, (ende-start)/(double)CLOCKS_PER_SEC);

	/* zweiten Algorithmus MAX_I mal aufrufen */
	start=clock();
	for(i=0; i<MAX_I; ++i){
		printf("\r%6.3f%% bearbeitet...", i/(double)MAX_I*100);
		ergebnis=summe(a, n);
	}
	ende=clock();
	printf("\rSumme:      %ld, benoetigte Zeit: %6.3f\n", ergebnis, (ende-start)/(double)CLOCKS_PER_SEC);

	return 0;
}
/* ---- Dateiende -------------------------------------------------------------	*/



