Pagini recente » Cod sursa (job #2572926) | Cod sursa (job #1192749) | Cod sursa (job #2980730) | Istoria paginii runda/oji_sim/clasament | Cod sursa (job #1378698)
#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] > 0 && !S[S[0]]) S[0]--;
}
void Mul(int A[], int B[])
{
int i, j, t = 0, C[Vmax];
memset(C, 0, sizeof(C));
if (B[0] == 0) return;
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;
if (B == 0) return;
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;
}