Cod sursa(job #997971)

Utilizator gteamG Team gteam Data 15 septembrie 2013 12:46:44
Problema Fractii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<fstream>
//#include <windows.h>
#include <string.h>
using namespace std;

void realoca(int *&v,int nr)
{
	int *v2 = new int[nr+1];
	memcpy(v2,v,nr*sizeof(int));
	v2[nr] = 0;
	delete[] v;
	v = v2;
}

void calcDivizori(int nr,int *& divizori)
{
	int div = 0;
	for (int i=2;i<=nr;++i)
	{
		if(nr%i==0)
			divizori[div++]=i;
	}
	//realoca(divizori,div);
}



void calcMultipli(int nr,int n,int *&multipli)
{
	int mul = 0;
	for (int i=n;i>nr;--i)
	{
		if(i%nr==0)
			multipli[mul++]=i;
	}
	
	//realoca(multipli,mul);
}
int **alocaMatrice(int n,int m)
{
	int **matrice = new int *[n];
	for(int i=0;i<n;++i)
	{
		matrice[i] = new int[m];
		//memset(matrice[i],0,sizeof(int)*m);
	}
	return matrice;
}

void dealocaMatrice(int **matrice,int n)
{
	for(int i=0;i<n;++i)
		delete []matrice[i];
	delete[] matrice;
}
bool xEInVector(int x,int * vector, int n)
{
	for (int i=0;i<n && vector[i];++i)
	{
		if (x==vector[i])
		{
			return true;
		}
	}
	return false;
}
bool vectorContineElDinVector(int *v1,int *v2,int n)
{
	for(int j =0;j<n&&v1[j];j++)
	{
		for (int i=0;i<n && v2[i];++i)
		{
			if(v2[i] == v1[j])
				return true;
		}
	}

	return false;
}
int main()
{
	ifstream fin("fractii.in");
	ofstream fout("fractii.out");
	int n=0;
	fin>>n;
	if(n)
	{
		int ** divizori = alocaMatrice(n-1,n-1);
		for (int i=2;i<=n;++i)
		{
			calcDivizori(i,divizori[i-2]);
		}

		int ** multipli = alocaMatrice(n-1,n-1);
		for (int i=2;i<=n;++i)
		{
			calcMultipli(i,n,multipli[i-2]);
		}
		//char msg[1000];
		int scadeNr = 0;
		for(int i=2;i<=n;++i)
		{
			for (int j=0;j<n-1;++j)
			{
				if(i==n && j==n-2)
					continue;
				if (xEInVector(i,divizori[j],n) || xEInVector(i,multipli[j],n) || vectorContineElDinVector(divizori[j],divizori[i-2],n) /*|| vectorContineElDinVector(multipli[j],multipli[i-2],n)*/)
				{
				//	sprintf(msg,"\r\nAm scos pentru %d si %d\r\n",i,j+2);
					//OutputDebugStringA(msg);
					scadeNr++;
				}
			}
		}
		int total = (n * n) - scadeNr -1;
		fout<<total;
		fin.close();
		fout.close();
		dealocaMatrice(divizori,n-1);
		dealocaMatrice(multipli,n-1);
	}
	return 0;
}