Cod sursa(job #195675)

Utilizator gabor_oliviu1991gaboru corupt gabor_oliviu1991 Data 20 iunie 2008 16:54:20
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.23 kb
#include<fstream.h>
#include<math.h>
#include <stdio.h>

void quickSort(long numbers[], int array_size);
void q_sort(long numbers[], int left, int right);
void citire();
long verific_delta();
void construire_div();
void construire_sol(long x,long y,int poz);
int verific(int t);
void sortez();
void afisare(long k);

ifstream f("ecuatie.in");
ofstream g("ecuatie.out");


///////////////////////////////////////////////////////
////		  _     _          _               ////
////        \  / | | | | \   |\/| |_| | |\ |       ////
////         \/  |_| | |_/   |  | | | | | \|       ////
////                                               ////
///////////////////////////////////////////////////////


/*	VARIABILE	*/

long a,b,c,k,v[100][5],i,j,m,p[100];

int main()
{


	citire();
	long h=verific_delta();
	if(h!=0)
		{	long x1=(-b-h)/(2*a);
			long x2=(-b+h)/(2*a);
			construire_div();
			for(i=0,j=0;i<m;i++)
				{ construire_sol(x1,x2,j);
				  if(verific(j)!=0)
					j++;
				  construire_sol(x2,x1,j);
				  if(verific(j)!=0)
					j++;
				}
			sortez();
			k--;
			j--;
			if(k<=j)		afisare(k);
			else			g<<"-1";
		}
	else
		g<<"-1";

	return 0;
}

void citire()
{	f>>a>>b>>c>>k;		}  	//global

long verific_delta()
{
	long delta=b*b-4*a*c;
	if(delta<0)
		return 0;
	else
		{
		long m=sqrt(delta);
		if(delta==m*m)
			return m;
		}
return 0;
}

void construire_div()
{
	int l;
	long d[100];
	for(i=1;i<=sqrt(abs(a));i++)
		if(a%i==0)
		{
			d[l++]=i;
			d[l++]=-i;
			d[l++]=a/i;
			d[l++]=-a/i;
		}

	q_sort(d,0,l-1);
	m=0;
	for(i=0;i<l;i++)
		if(d[i]!=d[i+1])
			p[m++]=d[i];
}

void construire_sol(long x,long y,int poz)
{
	v[poz][1]=p[i];
	v[poz][2]=-x*p[i];
	v[poz][3]=a/p[i];
	v[poz][4]=-y*(a/p[i]);
}

int verific(int t)
{
	if((v[t][1]!=0&&v[t][2]!=0&&v[t][3]!=0&&v[t][4]!=0)&&(v[t][2]*v[t][4]==c)&&(v[t][1]*v[t][3])==a)
		return 1;

	return 0;
}

void sortez()
{
	int aux;
	for(i=0;i<j-1;i++)
	     if(v[i][1]==v[i+1][1])
		if(v[i][2]>v[i+1][2])
			{
				aux=v[i][2];
				v[i][2]=v[i+1][2];
				v[i+1][2]=aux;
			}
}

void afisare(long k)
{
      if(v[k][1]==1)			g<<"(x";
      else
		if(v[k][1]==-1)  	g<<"(-x";
		else  			g<<"("<<v[k][1]<<"x";
			if(v[k][2]>0)   g<<"+"<<v[k][2]<<")";
			else   		g<<v[k][2]<<")";

      if(v[k][2]==1)   			g<<"(x";
      else
		if(v[k][2]==-1)  	g<<"(-x";
		else       		g<<"("<<v[k][2]<<"x";
			if(v[k][4]>0)   g<<"+"<<v[k][4]<<")";
			else  		g<<v[k][4]<<")";

}

void q_sort(long numbers[], int left, int right)
{
   int pivot, l_hold, r_hold;
   l_hold = left;
   r_hold = right;
   pivot = numbers[left];
   while (left < right)
   {
      while ((numbers[right] >= pivot) && (left < right))
      right--;
      if (left != right)
      {
	 numbers[left] = numbers[right];
	 left++;
      }
      while ((numbers[left] <= pivot) && (left < right))
	 left++;
      if (left != right)
      {
	  numbers[right] = numbers[left];
	  right--;
      }
   }
   numbers[left] = pivot;
   pivot = left;
   left = l_hold;
   right = r_hold;
   if (left < pivot)
      q_sort(numbers, left, pivot-1);
   if (right > pivot)
      q_sort(numbers, pivot+1, right);
}