#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<ctime>
#include<fstream>
#define max(X , Y ) ((X) > (Y) ? (X) : (Y) )


float max1(float list[], const int n)
{
	float * pro = new float[n];

	pro[0] = list[0];
	float max = pro[0] ;

	for(int k=1 ; k<n ; k++)
	{
		pro[k] = max(list[k] , list[k] * pro[k-1]);
		if(pro[k] > max )
			max = pro[k] ;
	}
	return max ;
}

float max2(float list[] , const int n)
{
	float pro = list[0];
	float temp = list[0];
	for(int i=1;i<n;i++)
	{
		pro *=list[i];

		if(list[i] > pro )
			pro = list[i] ;

		if(pro > temp)
			temp = pro;

		if(temp < list[i])
			temp = list[i];

		if(pro == 0 )
			pro = 1 ;

	}
	return temp ;

}


int main()
{
	float  * list = 0;
	std::ofstream result("result.txt",std::ios::out);
	srand(time(0));

	unsigned counter = 10000; //  number of loop

	for(int i = 0 ; i<counter; i++)
	{
		unsigned int size = rand()%10; // size of array of float
		if(size == 0 )
			continue ;
		
		delete []list; // because list pointer point to array of float in prevoius loop
		list = new float[size];

		for(int j = 0 ; j<size ; j++)
		{
			float num = unsigned(rand()%100);
			float denom = unsigned(rand()%100);
			if(denom == 0 )
				denom=1;
			list[j] = num/denom ;
		}

		float f1 = max1(list,size) ,
			  f2 = max2(list,size) ;

		result<<i<<"  "<<" SIZE = "<<size<<"\n";
		result<<" max1 = "<<f1<<"\n";
		result<<" max2 = "<<f2<<"\n";
		result<<"-----------------------------------\n";
		
		if(f1 != f2 )
		{
			std::ofstream print("error.txt",std::ios::out);
			print<<i<<" f1 != f2\n"
			<<"f1 = "<<f1<<"\n"<<"f2 = "<<f2<<"\n";
			for(int i=0 ; i<size ;i++)
			{
				print<<"list["<<i<<"] = "<<list[i]<<"\n";
			}
		}

		
	}


}

