Pagini recente » Cod sursa (job #569253) | Cod sursa (job #1611243) | Cod sursa (job #2374155) | Cod sursa (job #1263929) | Cod sursa (job #3122799)
#include <fstream>
using namespace std;
struct nod
{
int val;
nod *dr;
nod()
{
dr = nullptr;
val = 0;
}
};
struct huge
{
nod *nr = new nod();
int len;
huge(string s)
{
len = s.size();
nr->val = s.back() - '0';
nod *aux = nr;
for (int i = s.size() - 2; i > -1; i--)
{
aux->dr = new nod();
aux->dr->val = s[i] - '0';
aux = aux->dr;
}
}
huge()
{
nr->val = 0;
}
};
huge operator +(huge a, huge b)
{
int tr = 0;
nod *a1 = a.nr;
nod *b1 = b.nr;
int mx = max(a.len, b.len);
huge c;
nod *aux = c.nr;
c.len = mx;
nod *ax;
for (int i = 0; i < mx; i++)
{
int x, y;
if (a1 == nullptr)
x = 0;
else
x = a1->val;
if (b1 == nullptr)
y = 0;
else
y = b1->val;
int val = tr + x + y;
aux->val = val % 10;
tr = val / 10;
aux->dr = new nod();
ax = aux;
aux = aux->dr;
if (a1)
a1 = a1->dr;
if (b1)
b1 = b1->dr;
}
while (tr)
{
aux->val = tr % 10;
aux->dr = new nod();
ax = aux;
aux = aux->dr;
tr /= 10;
}
ax->dr = nullptr;
return c;
}
int cnt;
bool moarte(nod *val)
{
if (val->dr == nullptr)
return (val->val == 0);
bool ok = moarte(val->dr);
if (ok)
{
cnt++;
val->dr = nullptr;
}
return (ok and val->val == 0);
}
huge operator -(huge a, huge b)
{
huge c;
nod *aux = c.nr;
int tr = 0;
nod *a1 = a.nr;
nod *b1 = b.nr;
c.len = a.len;
nod *ax;
for (int i = 0; i < a.len; i++)
{
int x;
if (b1 == nullptr)
x = 0;
else
x = b1->val;
int val = a1->val - x - tr;
if (val < 0)
{
tr = 1;
val += 10;
}
else
tr = 0;
aux->val = val;
aux->dr = new nod();
ax = aux;
aux = aux->dr;
if (b1)
b1 = b1->dr;
a1 = a1->dr;
}
ax->dr = 0;
cnt = -1;
moarte(c.nr);
c.len -= cnt;
return c;
}
huge operator *(huge a, huge b)
{
huge c;
c.len = a.len + b.len - 1;
nod *aux = c.nr;
nod *ax;
for (int i = 1; i <= c.len; i++)
{
aux->dr = new nod();
ax = aux;
aux = aux->dr;
}
ax->dr = nullptr;
aux = c.nr;
for (nod *i = a.nr; i; i = i->dr)
{
ax = aux;
for (nod *j = b.nr; j; j = j->dr, ax = ax->dr)
{
ax->val += i->val * j->val;
}
aux = aux->dr;
}
int t = 0;
aux = c.nr;
for (int i = 1; i <= c.len; i++)
{
t += aux->val;
aux->val = t % 10;
t /= 10;
ax = aux;
aux = aux->dr;
}
if (t)
{
c.len++;
ax->dr = new nod();
ax->dr->val = t;
}
cnt = 0;
moarte(c.nr);
c.len -= cnt;
return c;
}
void print(nod *nr, ostream& os)
{
if (nr->dr == nullptr)
{
os << nr->val;
return ;
}
print(nr->dr, os);
os << nr->val;
}
void afis(huge a, ostream& os)
{
print(a.nr, os);
}
ostream& operator <<(ostream& os, huge a)
{
afis(a, os);
return os;
}
int cmp(string a, string b)
{
if (a.size() != b.size())
return a.size() - b.size();
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
int main()
{
ifstream cin("adunare.in");
ofstream cout("adunare.out");
/* cout << "Introdu primul numar:";
string a;
cin >> a;
huge x(a);
cout << "\nIntrodu al doilea numar:";
string b;
cin >> b;
huge y(b);
cout << "\nIntrodu operatia:";
char c;
cin >> c;
if (c == '+')
{
x = x + y;
cout << x;
}
else if (c == '-')
{
if (cmp(a, b) < 0)
{
cout << "-";
swap(x, y);
}
x = x - y;
cout << x;
}
else if (c == '*')
{
x = x * y;
cout << x;
}
else
cout << "Operatie invalida!";
return 0;*/
string a, b;
cin >> a >> b;
huge x(a), y(b);
x = x + y;
cout << x;
}