Cod sursa(job #197991)

Utilizator gabor_oliviu1991gaboru corupt gabor_oliviu1991 Data 7 iulie 2008 17:26:20
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.1 kb
#include<fstream.h>
#include<math.h>
#include <stdio.h>

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

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

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

int main()
{


	citire();
	long double h=verific_delta();
	if(h!=0)
		{	long double x1=(long double )(-b-h)/(2*a);
			long double x2=(long double )(-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)         g<<"-1";
			else		  afisare(k);
		}
	else
		g<<"-1";

	return 0;
}

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

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

void construire_div()
{
	int l=0;
	long 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 double x,long double 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;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;

				aux=v[i][3];
				v[i][3]=v[i+1][3];
				v[i+1][3]=aux;

				aux=v[i][4];
				v[i][4]=v[i+1][4];
				v[i+1][4]=aux;

			}
}

void afisare(long 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][3]==1)   			g<<"(x";
      else
		if(v[k][3]==-1)  	g<<"(-x";
		else       		g<<"("<<v[k][3]<<"x";
			if(v[k][4]>0)   g<<"+"<<v[k][4]<<")";
			else  		g<<v[k][4]<<")";

}

void q_sort(long 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);
}