#include #include #define MAX 40 int fpole[MAX]; char fcislo[MAX]; void initFib () { int i; fpole[0]=1; fpole[1]=2; for (i = 2; i < MAX; i++) fpole[i]=fpole[i-1] + fpole[i-2]; } int fibToDec (char *a) { int result = 0; int len = strlen (a) - 1; int i; for (i = len; i >= 0; i--) { if (a[i]=='1') result += fpole[len - i]; } return result; } int nearestSmaller (int a) { int i = MAX - 1; while (a < fpole[i]) i--; return i; /* int m= l + ((p - l) / 2); printf ("median: %d\n", m); printf ("fib. cislo medianu: %d\n", fpole[m]); if (fpole[m] == a) return m; if (fpole[m] > a) { if (fpole[m-1] < a) return (m - 1); else return nearestSmaller (l, m - 1, a); } else if (fpole[m] < a) { if (fpole[m+1] > a) return (m + 1); else return nearestSmaller (m + 1, p, a); } return -1; */ } void VratCislo(int index,int cislo) { int i; for (i=index;i>=0;i--) { if (fpole[i]>cislo) fcislo[index-i]='0'; else { fcislo[index-i]='1'; cislo-=fpole[i]; } } fcislo[index+1]='\0'; } int main () { char *a = (char*)calloc(sizeof (char), MAX + 1); char *b = (char*)calloc(sizeof (char), MAX + 1); char *c = (char*)calloc(sizeof (char), MAX + 1); int x, y, z; int len; int i; initFib(); while (scanf ("%s %s", a, b) != EOF) { /* printf ("cislo a:%s ", a); printf ("cislo b:%s ", b); */ x = fibToDec (a); y = fibToDec (b); z = x + y; VratCislo(nearestSmaller(x), x); strcpy (a, fcislo); VratCislo(nearestSmaller(y), y); strcpy (b, fcislo); VratCislo(nearestSmaller(z), z); strcpy (c, fcislo); len = strlen (c); for (i = 0; i < (len - strlen(a) + 2); i++) printf (" "); printf ("%s \n", a); printf ("+ "); for (i = 0; i < (len - strlen(b)); i++) printf (" "); printf ("%s \n", b); printf (" "); for (i = 0; i < len; i++) printf ("-"); printf ("\n "); printf ("%s \n", c); printf ("\n"); } free (a); free (b); free (c); return 0; }