-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfibosums.cpp
More file actions
144 lines (132 loc) · 4.05 KB
/
fibosums.cpp
File metadata and controls
144 lines (132 loc) · 4.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
* Rappresentazione numerica tramite numeri di Fibonacci
* Author: ER
* Date: 2023/04/28
* Note:
*/
/*
Somme di Fibonacci (fibosums)
Ogni numero naturale N è rappresentabile come somma di zero o più numeri di
Fibonacci diversi. Si ricorda che i numeri di Fibonacci Fi sono i numeri della
successione: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
Ad esempio, il numero N = 31 è rappresentabile come:
N = 31 = 21 + 8 + 2 = F8 + F6 + F3
N = 31 = 13 + 8 + 5 + 3 + 1 + 1 = F7 + F6 + F5 + F4 + F2 + F1
e, forse, in altri modi ancora ...
Date M stringhe di caratteri '0' ed '1', in cui l'i-esimo carattere della stringa (la
posizione del primo carattere della stringa è i = 1) indica la presenza o meno
dell'i-esimo numero di Fibonacci nella somma, determinare la rappresentazione
decimale del numero N corrispondente a ciascuna stringa.
Ad esempio, data la stringa S = “00100101”, in cui il 3°, 6° ed 8° carattere
sono '1', essa corrisponde alla somma F3 + F6 + F8 e quindi il numero N
corrispondente è, in notazione decimale, 31.
Allo stesso modo, data la stringa S = “1101111”, il numero N corrispondente è,
in notazione decimale, 31.
Assunzione: 0 ≤ N ≤ 1011, 1 < |S| < 50, 1 ≤ M ≤ 100.
Formato di input: la prima linea contiene il numero intero M. Le M successive
linee contengono ciascuna una stringa S. Ogni stringa consiste di una sequenza
di |S| caratteri '0' oppure '1'.
Formato di output: M righe contenenti ciascuna il numero N corrispondente a
ciascuna stringa.
Esempi:
Input Output Spiegazione
2 31 Esempio del testo.
00100101 31 Esempio del testo.
1101111
Nota: con |S| si indica la lunghezza della stringa S.
*/
#include <iostream>
using namespace std;
const bool DEBUG = true;
#define MAX_TESTS 100 // maximum number of tests
#define MAX_LENGTH 49 // maximum string length
// basic numeric type
using number = unsigned long long int;
// prototipi delle funzioni
number fibonacciIterativo(number n);
// number fibonacciRicorsivo(number n); NOT to be used !!!
number fibonacciRicorsivoMemoization(number n);
// the main function
int main(int argc, char *args[])
{
// setup fibonacci numbers
number fibonacci[MAX_LENGTH + 1]; // fibonacci numbers
for (size_t f = 0; f <= MAX_LENGTH; f++)
{
fibonacci[f] = fibonacciIterativo(f);
}
// better
fibonacci[0] = fibonacci[1] = 1;
for (size_t f = 2; f <= MAX_LENGTH; f++)
{
fibonacci[f] = fibonacci[f - 1] + fibonacci[f - 2];
}
number M;
cin >> M;
char stringa[MAX_LENGTH + 1];
// cin.getline(stringa, sizeof(stringa)); // reads first newline
for (int t = 0; t < M; ++t)
{
cin >> stringa;
// cin.getline(stringa, sizeof(stringa));
number n = 0;
size_t i = 0;
while (stringa[i] != 0)
{
if (stringa[i] == '1')
{
n += fibonacci[i];
}
++i;
}
cout << n << endl;
}
// successful termination
return 0;
}
number fibonacciIterativo(number n)
{
if (n < 2)
{
return n;
}
else
{
number k = 2; // current
number f_k_2 = 0; // f[k-2]
number f_k_1 = 1; // f[k-1]
number f_k = f_k_1 + f_k_2; // f[k]
while (k < n)
{
// compute next
k++;
f_k_2 = f_k_1;
f_k_1 = f_k;
f_k = f_k_1 + f_k_2;
}
return f_k;
}
}
number fibonacciRicorsivo(number n)
{
if (DEBUG)
{
cout << "--> fibonacciRicorsivo(" << n << ")." << endl;
}
return n < 2 ? n : fibonacciRicorsivo(n - 1) + fibonacciRicorsivo(n - 2);
}
number fibonacciRicorsivoMemoization(number n)
{
static number soluzioni[MAX_LENGTH + 1];
if (DEBUG)
{
cout << "--> fibonacciRicorsivoMemoization(" << n << ")." << endl;
}
if (n < 2)
return n;
if (soluzioni[n] == 0)
{ // not solved yet
soluzioni[n] = fibonacciRicorsivoMemoization(n - 1) + fibonacciRicorsivoMemoization(n - 2);
}
return soluzioni[n];
}