Cod sursa(job #1378691)

Utilizator EpictetStamatin Cristian Epictet Data 6 martie 2015 13:43:31
Problema A+B Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <fstream>
#include <string>
#include <cstring>
#define Vmax 110
#define MOD 10
using namespace std;
ifstream fin ("adunare.in");
ofstream fout ("adunare.out");
int N[Vmax], M[Vmax], D[Vmax];
string BUFF;
// (N + M) * (|N - M|) / (|M - N|)

void Read_Data(int A[])
{
    string BUFF;
    getline(fin, BUFF);
    for (int i = BUFF.size() - 1; i >= 0; i--) A[++A[0]] = BUFF[i] - '0';
}

bool Comp(int A[], int B[])
{
    if (A[0] > B[0]) return 1;
    if (A[0] < B[0]) return 0;
    for (int i = A[0]; i >= 0; i--)
    {
        if (A[i] > B[i]) return 1;
        if (A[i] < B[i]) return 0;
    }
    return 1;
}

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

void Scade(int S[], int A[], int B[])
{
    int i, t = 0;
    for (i = B[0] + 1; i <= A[0]; i++) B[i] = 0;
    for (i = 1; i <= A[0]; i++)
    {
        S[i] = A[i] - B[i] - t;
        if (S[i] < 0)
        {
            t = 1;
            S[i] += MOD;
        }
        else t = 0;
    }
    S[0] = A[0];
    while (S[0] > 1 && !S[S[0]]) S[0]--;
}

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

void Din_Nr_Mare_In_Nr_Mic(int &nr, int A[])
{
    for (int i = A[0]; i >= 1; i--) nr = nr * 10 + A[i];
}

void Div(int A[], int B)
{
    int i, t = 0;
    for (i = A[0]; i >= 1; i--, t %= B)
    {
        A[i] = (t = t * MOD + A[i]) / B;
    }
    while (A[0] > 1 && !A[A[0]]) A[0]--;
}

void Write_Data(int A[])
{
    for (int i = A[0]; i >= 1; i--) fout << A[i];
}

int main()
{
    Read_Data(N);
    Read_Data(M);
    if (Comp(N, M)) Scade(D, N, M);
    else Scade(D, M, N);
    Add(N, M);
    Mul(N, D);
    int d = 0;
    Din_Nr_Mare_In_Nr_Mic(d, D);
    Div(N, d);
    Write_Data(N);
    return 0;
}