Cod sursa(job #111027)

Utilizator hadesgamesTache Alexandru hadesgames Data 28 noiembrie 2007 14:56:20
Problema Ecuatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
 int compare( const void* a, const void* b ) {
   int* aa = (int*) a;
   int* bb = (int*) b;
   if( *aa < *bb ) return -1;
   else if( *aa == *bb ) return 0;
   else return 1;
 }    
 int intreg(double x)
 {
	if ((int)x==(double)x)
		return 1;
	else return 0;
 }
int main()
{
	FILE *in,*out;
	int d[100000],a,b,c,k,delta,x,nr,i,p1[2],q2[2],p2[2],q1[2];
	double x1,x2;
	in=fopen("ecuatie.in","r");
	out=fopen("ecuatie.out","w");
	fscanf(in,"%d%d%d%d",&a,&b,&c,&k);
	delta=b*b-4*a*c;
	if (delta<0||floor(sqrt(delta))*floor(sqrt(delta))!=delta)
	{
		fprintf(out,"-1\n");
		fclose(in);
		fclose(out);
		return 0;
	}
	x1=((double)(-b-sqrt(delta)))/((double)2*a);
	x2=((double)(-b+sqrt(delta)))/((double)2*a);
	nr=0;
	d[0]=-a-1;
	for (i=1;i<=sqrt(abs(a));i++)
		if (a%i==0)
		{
			nr++;
			d[nr]=i;
			nr++;
			d[nr]=-i;
			if (i!=a/i)
			{
				nr++;
				d[nr]=a/i;
				nr++;
				d[nr]=-(a/i);
			}
		}
	qsort(d,nr+1,sizeof(d[1]),compare);
	x=1;
	while (k>0&&x<=nr)
	{
		if (intreg(-x1*d[x])&&intreg(-x2*(a/d[x]))&&intreg(-x2*d[x])&&intreg(-x1*(a/d[x]))&&delta!=0)
		{
			if(-x1*d[x]<-x2*d[x])
			{
				p1[0]=d[x];
				p2[0]=a/d[x];
				q1[0]=-x1*d[x];
				q2[0]=-x2*(a/d[x]);
				p1[1]=d[x];
				p2[1]=a/d[x];
				q1[1]=-x2*d[x];
				q2[1]=-x1*(a/d[x]);
			}
			else
			{
				p1[1]=d[x];
				p2[1]=a/d[x];
				q1[1]=-x1*d[x];
				q2[1]=-x2*(a/d[x]);
				p1[0]=d[x];
				p2[0]=a/d[x];
				q1[0]=-x2*d[x];
				q2[0]=-x1*(a/d[x]);
			}
			k-=2;
		}
		else
		{
			if (intreg(-x1*d[x])&&intreg(-x2*(a/d[x])))
			{
				p1[1]=d[x];
				p2[1]=a/d[x];
				q1[1]=-x1*d[x];
				q2[1]=-x2*(a/d[x]);
				k--;
			}
			else
				if (intreg(-x2*d[x])&&intreg(-x1*(a/d[x])))
				{
					p1[1]=d[x];
					p2[1]=a/d[x];
					q1[1]=-x2*d[x];
					q2[1]=-x1*(a/d[x]);
					k--;
				}
		}
		x++;		
	}
	if (k>0)
	{
		fprintf(out,"-1\n");
		fclose(in);
		fclose(out);
		return 0;
	}
	if (p1[k+1]==1)
		fprintf(out,"(x");
	else
		if (p1[k+1]==-1)
			fprintf(out,"(-x");
		else
			fprintf(out,"(%dx",p1[k+1]);
	if (q1[k+1]<0)
		fprintf(out,"%d)",q1[k+1]);
	else
		fprintf(out,"+%d)",q1[k+1]);
	if (p2[k+1]==1)
		fprintf(out,"(x");
	else
		if (p2[k+1]==-1)
			fprintf(out,"(-x");
		else
			fprintf(out,"(%dx",p2[k+1]);
	if (q2[k+1]<0)
		fprintf(out,"%d)",q2[k+1]);
	else
		fprintf(out,"+%d)",q2[k+1]);
	fprintf(out,"\n");
	fclose(in);
	fclose(out);
	return 0;
}