Cod sursa(job #195668)

Utilizator gabor_oliviu1991gaboru corupt gabor_oliviu1991 Data 20 iunie 2008 16:05:55
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 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);

int main()
{

   long delta,v[1000][5],aux,a,b,c,k,d[1000]={0},m,p[1000]={0},l=0,j=0;float x1,x2;
   int i;
   float jj=0;

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

   f>>a>>b>>c>>k;

   delta=b*b-4*a*c;
   if (delta<0) g<<"-1";
	else
	{
   jj=sqrt(delta);

   if(delta==jj*jj)
   {
	x1=(-b-sqrt(delta))/(2*a);
	x2=(-b+sqrt(delta))/(2*a);
	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];

	j=0;
	for(i=0;i<m;i++)
		{
			v[j][1]=p[i];
			v[j][2]=-x1*p[i];
			v[j][3]=a/p[i];
			v[j][4]=-x2*(a/p[i]);
			if(v[j][1]!=0&&v[j][2]!=0&&v[j][3]!=0&&v[j][4]!=0)
				if((v[j][2]*v[j][4]==c)&&(v[j][1]*v[j][3])==a)
					j++;
			v[j][1]=p[i];
			v[j][2]=-x2*p[i];
			v[j][3]=a/p[i];
			v[j][4]=-x1*(a/p[i]);
			if((v[j][1]!=0)&&(v[j][2]!=0)&&(v[j][2]!=0)&&(v[j][4]!=0))
				if((v[j][2]*v[j][4]==c)&&(v[j][1]*v[j][3])==a)
					j++;
		}

	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;
			}
	j--;
	k--;
	if(k<=j)
	{
		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]<<")";
	}
   else g<<"-1";
   }
   else
	g<<"-1";
  }
   return 0;
}


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);
}