Cod sursa(job #1628674)

Utilizator hrazvanHarsan Razvan hrazvan Data 4 martie 2016 10:02:00
Problema Sarpe Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <stdio.h>
#define MAXL 2001
typedef struct{
  int v[MAXL];
  int d;
}numar;
numar rez, aux1, aux2, n;

inline void copy(numar *a, numar b){
  int i;
  for(i = 0; i < b.d; i++)
    a->v[i] = b.v[i];
  a->d = b.d;
}

inline void prod(numar *a, numar b){
  numar aux;
  int i, j;
  for(i = 0; i < a->d + b.d; i++)
    aux.v[i] = 0;
  for(i = 0; i < a->d; i++){
    for(j = 0; j < b.d; j++){
      aux.v[i + j] += a->v[i] * b.v[j];
    }
  }
  i = 0;
  int tr = 0;
  while(i < a->d + b.d - 1 || tr > 0){
    aux.v[i] += tr;
    tr = aux.v[i] / 10;
    aux.v[i] %= 10;
    i++;
  }
  for(j = 0; j < i; j++)
    a->v[j] = aux.v[j];
  a->d = i;
}

inline void add(numar *a, numar b){
  int i, tr;
  for(i = 0; i < b.d; i++){
    a->v[i] += b.v[i];
  }
  i = 0;
  tr = 0;
  while(i < a->d || i < b.d || tr > 0){
    a->v[i] += tr;
    tr = a->v[i] / 10;
    a->v[i] %= 10;
    i++;
  }
  a->d = i;
}

inline void scad(numar *a, int x){
  int i = 0;
  a->v[i] -= x % 10;
  x /= 10;
  while(a->v[i] < 0){
    a->v[i] += 10;
    a->v[i + 1]--;
    i++;
    a->v[i] -= x % 10;
    x /= 10;
  }
  while(a->d > 0 && a->v[a->d - 1] == 0)
    a->d--;
}

int main(){
  FILE *in = fopen("sarpe.in", "r");
  int i, aux;
  char ch = fgetc(in);
  while(ch >= '0' && ch <= '9'){
    n.v[n.d] = ch - '0';
    ch = fgetc(in);
    n.d++;
  }
  fclose(in);
  for(i = 0; i < n.d / 2; i++){
    aux = n.v[i];  n.v[i] = n.v[n.d - i - 1];  n.v[n.d - i - 1] = aux;
  }
  copy(&aux1, n);
  aux2.v[0] = 4;
  aux2.d = 1;
  prod(&aux1, aux2);
  add(&rez, aux1);
  copy(&aux1, n);
  scad(&aux1, 1);
  copy(&aux2, n);
  scad(&aux2, 2);
  prod(&aux1, aux2);
  aux2.v[0] = 2;
  aux2.d = 1;
  prod(&aux1, aux2);
  add(&rez, aux1);
  FILE *out = fopen("sarpe.out", "w");
  if(n.d == 1 && n.v[0] == 1)
    fprintf(out, "2");
  else
    for(i = rez.d - 1; i >= 0; i--)
      fprintf(out, "%d", rez.v[i]);
  fclose(out);
  return 0;
}