Fibonacci

Joined
May 13, 2023
Messages
1
Reaction score
0
that is wrong in this code ?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

char *multiplicare(const char *numar1, const char *numar2)
{
int lungime1 = strlen(numar1);
int lungime2 = strlen(numar2);
int lungimeRezultat = lungime1 + lungime2;
int *rezultat = (int *)calloc(lungimeRezultat, sizeof(int));

int i, j, k;
for (i = lungime1 - 1; i >= 0; i--)
{
for (j = lungime2 - 1; j >= 0; j--)
{
int produs = (numar1 - '0') * (numar2[j] - '0');
rezultat[i + j + 1] += produs;
rezultat[i + j] += rezultat[i + j + 1] / 10;
rezultat[i + j + 1] %= 10;
}
}

char *rezultatString = (char *)malloc((lungimeRezultat + 1) * sizeof(char));
int index = 0;
while (rezultat[index] == 0 && index < lungimeRezultat - 1)
{
index++;
}

for (i = index; i < lungimeRezultat; i++)
{
rezultatString[i - index] = rezultat + '0';
}
rezultatString[lungimeRezultat - index] = '\0';
puts(rezultatString);
free(rezultat);
return rezultatString;
}

char *adunare(const char *numar1, const char *numar2)
{
int lungime1 = strlen(numar1);
int lungime2 = strlen(numar2);
int lungimeRezultat = (lungime1 > lungime2) ? lungime1 + 1 : lungime2 + 1;
int *rezultat = (int *)calloc(lungimeRezultat * 10, sizeof(int));

int i, j, k;
for (i = lungime1 - 1, j = lungime2 - 1, k = lungimeRezultat - 1; i >= 0 || j >= 0; i--, j--, k--)
{
int cifra1 = (i >= 0) ? (numar1 - '0') : 0;
int cifra2 = (j >= 0) ? (numar2[j] - '0') : 0;
int suma = cifra1 + cifra2 + rezultat[k];
rezultat[k] = suma % 10;
rezultat[k - 1] = suma / 10;
}

char *rezultatString = (char *)malloc((lungimeRezultat + 1) * sizeof(char));
int index = 0;
if (rezultat[0] == 0)
{
index++;
}

for (i = index; i < lungimeRezultat; i++)
{
rezultatString[i - index] = rezultat + '0';
}
rezultatString[lungimeRezultat - index] = '\0';
free(rezultat);

puts(rezultatString);
return rezultatString;
}
char *fib(unsigned int n)
{
char *i = strdup("1");
char *j = strdup("0");
char *k = strdup("0");
char *h = strdup("1");
char *t;

while (n > 0)
{
if (n % 2 != 0)
{
t = multiplicare(j, h);
char *temp1 = multiplicare(i, h);
char *temp2 = multiplicare(j, k);
char *temp3 = adunare(temp1, temp2);
char *temp4 = adunare(temp3, t);
free(temp1);
free(temp2);
free(temp3);
free(t);
free(j);
j = temp4;
char *temp5 = multiplicare(i, k);
char *temp6 = adunare(temp5, t);
free(temp5);
free(t);
free(i);
i = temp6;
}

t = multiplicare(h, h);
char *temp7 = multiplicare("2", k);
char *temp8 = multiplicare(temp7, h);
char *temp9 = adunare(temp8, t);
free(temp7);
free(temp8);
free(t);
free(h);
h = temp9;
char *temp10 = multiplicare(k, k);
char *temp11 = adunare(temp10, t);
free(temp10);
free(t);
free(k);
k = temp11;

n /= 2;
}

free(h);
free(k);
free(t);

char *fib_sequence = strdup(j);

free(i);
free(j);

return fib_sequence;
}

// char *fib(unsigned int n)
// {
// char *i = "1";
// char *j = "0";
// char *k = "0";
// char *h = "1";
// char *t;

// while (n > 0)
// {
// if (n % 2 != 0)
// {
// char *temp1 = multiplicare(j, h);
// char *temp2 = multiplicare(i, h);
// char *temp3 = multiplicare(j, k);
// char *temp4 = adunare(temp2, temp3);
// char *temp5 = adunare(temp1, temp4);

// free(j);
// free(i);

// i = temp5;
// j = temp2;

// free(temp1);
// free(temp3);
// free(temp4);
// }

// char *temp6 = multiplicare(h, h);
// char *temp7 = multiplicare("2", k);
// char *temp8 = adunare(temp6, temp7);

// free(h);
// free(k);

// h = temp8;
// k = temp6;

// free(temp7);
// }

// return j;
// }

// char *fibonacci(int n)
// {
// if (n <= 0)
// {
// return NULL;
// }

// char *fib1 = "0";
// char *fib2 = "1";

// if (n == 1)
// {
// return fib1;
// }
// else if (n == 2)
// {
// return fib2;
// }

// char *fibN;
// int i;
// for (i = 3; i <= n; i++)
// {
// fibN = adunare(fib1, fib2);
// fib1 = fib2;
// fib2 = fibN;
// }

// return fibN;
// }

int main()
{
// Exemplu de utilizare
char *numar1 = "123";
char *numar2 = "456";
char *rezultatInmultire = multiplicare(numar1, numar2);
puts(rezultatInmultire);
free(rezultatInmultire);

char *numar3 = "789";
char *numar4 = "321";
char *rezultatAdunare = adunare(numar3, numar4);
printf("Suma: %s\n", rezultatAdunare);
free(rezultatAdunare);

int n = 0;
printf("NUMARUL:\r\n");
scanf("%d", &n);
clock_t start, end;
double execution_time;
start = clock();
char *rezultatFibonacci = fib(n);
end = clock();
execution_time = ((double)(end - start)) / CLOCKS_PER_SEC;
printf("Fibonacci %d: %s\n", n, rezultatFibonacci);
printf("time:%f", execution_time);
free(rezultatFibonacci);

return 0;
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top