Cod sursa(job #778056)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 13 august 2012 20:28:22
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <string.h>
#include <algorithm>

#define MAX 10005

using namespace std;

char sir[MAX];
int first[MAX], second[MAX], third[MAX];

void add(int A[], int B[])
{
      int i, t = 0;
      for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
              A[i] = (t += A[i] + B[i]) % 10;
      A[0] = i - 1;
}

void mul(int A[], int B)
{
      int i, t = 0;
      for (i = 1; i <= A[0] || t; i++, t /= 10)
              A[i] = (t += A[i] * B) % 10;
      A[0] = i - 1;
}

void sub(int A[], int B[])
{
      int i, t = 0;
      for (i = 1; i <= A[0]; i++)
      {
              A[i] -= ((i <= B[0]) ? B[i] : 0) + t;
              A[i] += (t = A[i] < 0) * 10;
      }
      for (; A[0] > 1 && !A[A[0]]; A[0]--);
}

void mul(int A[], int B[])
{
      int i, j, t, C[MAX];
      memset(C, 0, sizeof(C));
      for (i = 1; i <= A[0]; i++)
      {
              for (t=0, j=1; j <= B[0] || t; j++, t/=10)
                      C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;
              if (i + j - 2 > C[0]) C[0] = i + j - 2;
      }
      memcpy(A, C, sizeof(C));
}


void StringToVector(int *v, char *s)
{
    v[0] = strlen(s);
    for(int i = strlen(s) - 1, j = 1; i >= 0; i--, j++)
        v[j] = s[i] - '0';
}

int main()
{
    ifstream in("sarpe.in"); in.getline(sir, MAX); in.close();
    int unu[5], doi[5];
    unu[0] = unu[1] = 1;
    doi[0] = 1; doi[1] = 2;
    StringToVector(first, sir);
    StringToVector(second, sir);
    StringToVector(third, sir);
    ofstream out("sarpe.out");
    if(first[0] != 1 || first[1] != 1)
    {
        mul(first, 4);
        sub(second, unu);
        sub(third, doi);
        mul(second, 2);
        mul(second, third);
        add(first, second);
        reverse(first + 1, first + first[0] + 1);
        for(int i = 1; i <= first[0]; i++)
            out<<first[i];
    }
    else
        out<<"2";
    out.close();

    return 0;
}