All pastes #2134302 Raw Edit

Miscellany

public text v1 · immutable
#2134302 ·published 2012-03-31 15:20 UTC
rendered paste body
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int placas[10000][2];
int a[40];
int n_a;
int n_quadrados;

int ints_get (int *a)
{
  int result = 0;
  while (scanf ("%d", &a[result]) != EOF)
    result++;
  return result;
}

int ints_get_some (int *a, int n)
{
  int i;
  for (i = 0; i < n; i++)
    scanf ("%d", &a[i]);
  return n;
}

void ints_put (int *a, int n, char *separator)
{
  if (n>0)
  {
    int i;
    printf ("%d", a[0]);
    for (i = 1; i < n; i++)
      printf ("%s%d", separator, a[i]);
  }
}



void ints_show (int *a, int n)
{
  printf ("%d", n);
  if (n > 0)
  {
    printf (" ");
    ints_put (a, n, " ");
  }
  printf ("\n");}



int max(int * a, int x) //util para me dar o maior elemento do par de cada placa
{
    int a1=a[x*2];
    int b1=a[x*2+1];
    if(a1>b1)
    return a1;
    else
    return b1;
}

int min(int * a, int x)
{
    int a1=a[x*2];
    int b1=a[x*2+1];
    if(a1>b1)
    return b1;
    else
    return a1;
}


//int p=0; prof aconselhou a criar outra variavel para contar o numero deos quadrados, para nao estar o x como indice
void calc_quadrados(int x, int y)
{

int n_quadrados=y/x;

//printf("x->%d\ny->%d\nn_quadrados->%d\nx%y->%d\n",x,y,n_quadrados,y%x);
placas[x][0]=x;
placas[x][1]+=n_quadrados; //adiciona ao tamanho x, o numero de quadrados desta placa.

//for ()
//n_quadrados=p
//p++
if(y%x!=0)
calc_quadrados(y%x,x); //é recursivo, pois ele vai sempre avaliando se a divisão da para fazer o quadrado, se der soma mais um quadrado
                    //notar que os argumentos trocam, no calc_quadrados(), pois no rectangulo que sobra, o X passa a Y,
                        //e o Y passa a X, devido ao virar o rectangulo que sobra, depois é aplicar o mesmo algaritmo, até
}                       // a divisão dar resto 0.

void bubblesort(int n)
{
int i;
int j;
for (i= 1; i< n; i++)
  for (j = n-1; j >= i; j--)
   if (placas[j-1][0] < placas[j][0] )//desceding order
   {
    int m = placas[j-1][0]; //ordenar coluna 0
    placas[j-1][0] = placas[j][0];
    placas[j][0] = m;
    int m2=placas[j-1][1];           //ordenar coluna 1 , tem que ser feito, pois isto vai junto com toda a linha
    placas[j-1][1] = placas[j][1]; //se a coluna 0 vai ordenada, a coluna 1 também tem que ir atrás.
    placas[j][1] = m2;

   }
}


void metais (void)
{
int n=0;
int n_tamanhos=0; //contagem das dimensões dos quadrados
//int k=0;
int i;
int j=0;
n_a = ints_get(a);//array input
for(i=0;i<n_a/2;i++) //cada placa do input(por isso está dividido por metade)
{
    if(max(a,i)>n)
    n=max(a,i); //util para evitar que o bublesort vá ate ao fim do array, vai só ao essencial
    calc_quadrados (min(a,i),max(a,i)); // e calcula o numero de quadrados num rectangulo
}                 //aqui garanto o max a Y


bubblesort(n);//ordena a matriz em função do tamanho da placa
int l=0;
while(placas[l++][0]!=0)  //conta os tamanhos que não sejam zero
n_tamanhos++;
for(j=0;j<n_tamanhos;j++) // e mostra a matriz até ai(ser zero)
printf("%d %d\n", placas[j][0], placas[j][1]);

}

int main()
{
    metais();
    return 0;
}