Cod sursa(job #1395002)

Utilizator BanhidiBanhidi Zoltan Banhidi Data 20 martie 2015 21:58:58
Problema Fractii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>
#include <stdlib.h>

struct fractie {
  int p,q;
};

void eroare(int e) {
  switch(e) {
    case 1: printf("Eroare alocare dinamica a memoriei.\n"); break;
  }
  fflush(stdin); getchar();
  exit(e);
}

int cmmdc(int a, int b) {
  while (a!=b)
    if (a>b) a-=b;
    else b-=a;
  return(a);
}

void reduce(struct fractie *z) {
  int aux=cmmdc(z->p,z->q);
  z->p/=aux; z->q/=aux;
}

int cauta(struct fractie z,struct fractie *a,int h) {
  int i;
  for (i=0; i<h; i++)
    if (z.p==a[i].p && z.q==a[i].q) return(1);
  return(0);
}

int main() {
  FILE *f;
  int n,i,j,k=1,s=sizeof(struct fractie);
  struct fractie *a=(struct fractie*)malloc(s),b,*c;
  if (a==NULL) eroare(1);
  a->p=1; a->q=1;
  f=fopen("fractii.in","r");
  fscanf(f,"%d",&n);
  fclose(f);
  for(i=1; i<=n; i++)
    for (j=1; j<=n; j++) {
      b.p=i; b.q=j;
      reduce(&b);
      if (!cauta(b,a,k)) {
        c=(struct fractie*)realloc(a,s*(k+1));
        if (c==NULL) eroare(1);
        else {
          a=c; a[k++]=b;
        }
      }
    }
  //for (i=0; i<k; i++) printf("%d/%d ",a[i].p,a[i].q);
  free(a);
  f=fopen("fractii.out","w");
  fprintf(f,"%d",k);
  fclose(f);
  return(0);
}