Cod sursa(job #171847)

Utilizator gabor_oliviu1991gaboru corupt gabor_oliviu1991 Data 5 aprilie 2008 12:10:56
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 a,b,c,k,d[1000]={0},m,p[1000]={0},l=0;float x1,x2;
   int delta;
   struct { long p1,q1,p2,q2;}v[1000]={0},aux;
   int i,x;
   float j=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
	{
   j=sqrt(delta);

   if(delta==j*j)
   {
	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].p1=p[i];
			v[j].q1=-x1*p[i];
			v[j].p2=a/p[i];
			v[j].q2=-x2*(a/p[i]);
			if(v[j].p1!=0&&v[j].q1!=0&&v[j].p2!=0&&v[j].q2!=0)
				if(v[j].q1*v[j].q2==c&&(v[j].p1*v[j].p2)==a)
					j++;
			v[j].p1=p[i];
			v[j].q1=-x2*p[i];
			v[j].p2=a/p[i];
			v[j].q2=-x1*(a/p[i]);
			if(v[j].p1!=0&&v[j].q1!=0&&v[j].p2!=0&&v[j].q2!=0)
				if((v[j].q1*v[j].q2==c)&&(v[j].p1*v[j].p2)==a)
					j++;
		}

	for(i=0;i<j-1;i++)
	     if(v[i].p1==v[i+1].p1)
		if(v[i].q1>v[i+1].q1)
			{
				aux=v[i];
				v[i]=v[i+1];
				v[i+1]=aux;
			}
	j--;
	k--;
	if(k<=j)
	{
		if(v[k].p1==1)   g<<"(x";
		else
			if(v[k].p1==-1)  g<<"(-x";
			else  g<<"("<<v[k].p1<<"x";
		if(v[k].q1>0)    g<<"+"<<v[k].q1<<")";
		else   g<<v[k].q1<<")";
	if(v[k].p2==1)   g<<"(x";
	else
		if(v[k].p2==-1)  g<<"(-x";
		else       g<<"("<<v[k].p2<<"x";
	if(v[k].q2>0)  g<<"+"<<v[k].q2<<")";
	else  g<<v[k].q2<<")";
	}
   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);
}