Pagini recente » Cod sursa (job #684207) | Cod sursa (job #134160) | Cod sursa (job #688847) | Cod sursa (job #552985) | Cod sursa (job #2057834)
#include <fstream>
#include <cassert>
#include <cstring>
using namespace std;
class largeInt{
public:
struct digit{
short int a;
digit* next;
digit* prev;
digit(short int dec)
{
a = dec;
next = NULL;
prev = NULL;
}
};
largeInt(int n = 0)
{
if(n == 0)
{
first = new digit(0);
last = first;
}
else
{
first = NULL;
last = NULL;
while(n)
{
digit* tmp = new digit(n%10);
n = n/10;
if(last)
{
first->prev = tmp;
tmp->next = first;
first = tmp;
}
else
{
last = tmp;
first = tmp;
}
}
}
}
largeInt(digit* f, digit* l)
{
first = f;
last = l;
}
largeInt(const largeInt& other)
{
for(digit* i = other.getFirst(); i != NULL; i=i->next)
{
digit* tmp = new digit(i->a);
if(first)
{
last->next = tmp;
tmp->prev = last;
last = tmp;
}
else
{
first = tmp;
last = tmp;
}
}
}
inline int size() const
{
return length;
}
inline digit* getFirst() const
{
return first;
}
inline digit* getLast() const
{
return last;
}
inline static short int dVal(const digit* dg)
{
if(dg)
return dg->a;
return 0;
}
void operator =(const largeInt& other)
{
digit* tmp = first;
bool b = true;
for(digit* i = other.getFirst(); i != NULL; i=i->next)
{
if(tmp)
{
tmp->a = i->a;
tmp = tmp->next;
}
else
{
b = false;
tmp = new digit(i->a);
last->next = tmp;
tmp->prev = last;
last = tmp;
tmp = NULL;
}
}
if(b && tmp)
{
digit* i;
do{
i = tmp;
tmp = tmp->next;
delete i;
}while(tmp);
}
}
largeInt operator + (const largeInt& other)
{
digit* i = last;
digit* j = other.getLast();
digit* r_first = NULL;
digit* r_last = NULL;
int carry = 0;
while(i || j)
{
short int rez = dVal(i) + dVal(j) + carry;
carry = rez/10;
rez-=carry*10;
digit* tmp = new digit(rez);
if(r_last)
{
tmp->next = r_first;
r_first->prev = tmp;
r_first = tmp;
}
else
{
r_first = tmp;
r_last = tmp;
}
if(i)
i = i->prev;
if(j)
j = j->prev;
}
if(carry)
{
digit* tmp = new digit(carry);
tmp->next = r_first;
r_first->prev = tmp;
r_first = tmp;;
}
return largeInt(r_first, r_last);
}
static void print(const largeInt& a, ostream& g)
{
for(digit* i = a.getFirst(); i != NULL; i = i->next)
g << i->a;
}
~largeInt()
{
if(first)
{
digit* i;
do{
i = first;
first = first->next;
delete i;
}while(first);
}
first = NULL;
last = NULL;
}
private:
int length;
digit* first;
digit* last;
};
int n;
int main()
{
ifstream f("nunta.in");
ofstream g("nunta.out");
f >> n;
if(n == 1)
{
g << 1;
return 0;
}
if(n == 2)
{
g << 2;
return 0;
}
largeInt a(1);
largeInt b(2);
largeInt c(0);
for(int i = 2; i < n; i++)
{
c = a+b;
a = b;
b = c;
}
largeInt::print(c,g);
return 0;
}