Code: Select all
#include <cstdlib>
#include <iostream>
using namespace std;
typedef struct {
int len;
char digits[100];
} bint;
bint *results[251];
void init_bint(bint *b)
{
for( int i = 0; i < 100; i++ )
b->digits[i] = (char)(0);
}
bint *int_to_bint(int n)
{
int i, t;
bint *b = new bint;
init_bint(b);
b->len = -1;
t = n;
while(t > 0) {
b->len++;
b->digits[b->len] = (char)(t%10);
t = t / 10;
}
if( n == 0 ) b->len = 0;
return b;
}
bint *add_bint(bint *a, bint *b)
{
int carry, i;
bint *c = new bint;
init_bint(c);
c->len = max(a->len, b->len)+1;
carry = 0;
for( i = 0; i <= (c->len); i++ )
{
c->digits[i] = (char)((carry+a->digits[i]+b->digits[i]) % 10);
carry = (carry+a->digits[i]+b->digits[i])/10;
}
if( (int)c->digits[c->len] == 0 ) c->len--;
return c;
}
bint *ways(int n)
{
if( n == 1 or n == 0 ) { return int_to_bint(1); }
else if( results[n] != '\0' ) { return results[n]; }
bint *d1 = add_bint(ways(n-1), add_bint(ways(n-2), ways(n-2)));
results[n] = d1;
return results[n];
}
void print_bint(bint *b)
{
for( int v = b->len; v >=0; v-- )
cout << (int)b->digits[v];
cout << "\n";
}
int main(int argc, char *argv[])
{
int n;
while( cin >> n ) {
print_bint(ways(n));
}
}