Cod sursa(job #171720)

Utilizator gabor_oliviu1991gaboru corupt gabor_oliviu1991 Data 4 aprilie 2008 21:57:43
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 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 j,a,b,c,k,d[1000]={0},m,p[1000]={0},l=0;float x1,x2,delta;
   struct { long p1,q1,p2,q2;}v[1000]={0},aux;
   int i,x;
   ifstream f("ecuatie.in");
   ofstream g("ecuatie.out");
   f>>a>>b>>c>>k;
   delta=b*b-4*a*c;
   j=(int)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+=2)
	if(v[i].q1>v[i+1].q1)
	     {aux=v[i];v[i]=v[i+1];v[i+1]=aux;}

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