skullek Temat założony przez niniejszego użytkownika |
Ciąg fibonacciego - wektor » 2015-11-25 13:11:23 Witam mam problem z takim zadankiem: Mam wygenerować n liczb ciągu fibonacciego następnie zapisać je do tablicy o pojemności 10, zawierającej w poszczególnych pozycjach wskaźniki do wektorów tych (wygenerowanych) liczb Fibonacciego, które kończą się cyfrą odpowiadającą indeksowi w tablicy wskaźników Czyli dla n 10 wyglądałoby to tak: 0 1 1 2 3 5 8 13 21 34 55 Sprawdzam ostatnią cyfrę każdej liczby 0 1 1 2 3 5 8 3 1 4 5 Tworzę i wyświetlam tablicę: 0 - 0 1 - 1,1,21 2 - 2 3 - 3, 13 4 - 34 5 - 5, 55 6 - PUSTO 7 - PUSTO 8 - 8 9 - PUSTO Ustałem w tym miejscu, i nie wiem co robić dalej, nie wiem czy to dobra metoda, dopiero zaczynam programować dośc długo nad tym siedziałem KOD: #include <iostream> #include <cstdlib> #include <string> using namespace std;
void fib( int n, int tablica[], int tablica2[] ) { if( n >= 2 ) { tablica[ 0 ] = 0; tablica[ 1 ] = 1; for( int i = 2; i <= n; i++ ) { tablica[ i ] = tablica[ i - 2 ] + tablica[ i - 1 ]; } for( int i = 0; i <= n; i++ ) { tablica2[ i ] = tablica[ i ]; } } else cout << 1; }
void vector( int * tab, int tablica2[] ) { int ** t; t = new int *[ 10 ]; for( int i = 0; i < 10; i++ ) { t[ i ] = new int[ tab[ i ] ]; } }
void ostatnia_cyfra( int n, int tablica[], int tablica2[], int liczba = 0 ) { int lenght[ 10 ] = { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; for( int i = 2; i <= n; i++ ) { liczba = tablica[ i ] % 10; tablica[ i ] = liczba; for( int j = 0; j < 10; j++ ) { if( liczba == j ) { lenght[ j ] ++; } } } vector( lenght, tablica2 ); }
int main() { int n; cin >> n; int * tablica = new int[ n ]; int * tablica2 = new int[ n ]; fib( n, tablica, tablica2 ); ostatnia_cyfra( n, tablica, tablica2 ); system( "pause" ); return 0; } |
|
michal11 |
» 2015-11-25 14:30:26 Dlaczego obydwie tablice tworzysz n elementowe ? Przecież jedna z nich ma mieć tylko 10 elementów. W funkcji fib wychodzisz poza zakres tablicy. A druga pętla jest bez sensu, co ma robić ? Funkcja ostatnia_cyfra jest w ogóle do zmiany. Potrzebujesz tablicy wskaźników (według zadania) czyli int * tab[ 10 ]; . Dalej szukasz ostatniej cyfry dla każdej liczby z ciągu Fibonacciego, to masz ok, liczba = tablica[ i ] % 10; chociaż nie wiem czemu to jest argument funkcji w dodatku z parametrem domyślnym i przy wywoływaniu i tak nic nie jest przekazywane. Pętla jest nie potrzebna, skoro wiesz pod jaki indeks masz wpisać daną liczbę z tablicy (ostatnia cyfra) to nie musisz jej szukać tab[ liczba ] . I teraz najtrudniejsza część czyli dopisanie aktualnej liczby do tablicy, w tym momencie najlepiej zrobić sobie funkcję ( a w ogóle najlepiej byłyby skorzystać z vectora<>), dodaj_liczbe( tab[ liczba ], dlugosci[ liczba ], tablica[ i ] ); w kótrej do danej tablicy tab[liczba] będziesz dopisywał liczbę tablica za elementem dlugosci[liczba] (oczywiście długości tych 10 tablic musisz sobie też dodać i zapisywać). Aha, no i masz masę wycieków pamięci. Mam nadzieję, że nie namieszałem za bardzo. |
|
skullek Temat założony przez niniejszego użytkownika |
» 2015-11-25 17:03:53 Zrobiłem to zadanie jeszcze raz, trochę inaczej, zanim przeczytałem tego posta, jeszcze będę nad nim pracował, ale ogólnie już działa, co myslicie? #include <iostream> #include <cstdlib> #include <string> using namespace std;
struct Liczby { int liczba; int koniec_liczby; };
void read_vector( Liczby *& t, int k ) { t = new Liczby[ k ]; }
void fibonaci( int k, Liczby * t ) { t[ 0 ].liczba = 0; t[ 1 ].liczba = 1; for( int i = 2; i <= k; i++ ) { t[ i ].liczba = t[ i - 2 ].liczba + t[ i - 1 ].liczba; } }
void ostatnia_cyfra( int k, Liczby * t, int * l ) { for( int i = 0; i < k; i++ ) { t[ i ].koniec_liczby = t[ i ].liczba % 10; l[ t[ i ].koniec_liczby ] ++; } }
void read_matrix( int **& tab, int & n, Liczby * t, int * l ) { tab = new int *[ n ]; for( int i = 0; i < n; i++ ) { tab[ i ] = new int[ l[ i ] ]; } }
void fill_matrix( int **& tab, int & n, int * l, Liczby * t, int r ) { for( int i = 0; i < n; i++ ) { int q = 0; for( int k = 0; k < l[ i ]; k++ ) { for( q; q < r; q++ ) { if( t[ q ].koniec_liczby == i ) { tab[ i ][ k ] = t[ q ].liczba; q++; break; } } } } }
void display_matrix( int **& tab, int & n, int * l ) { for( int i = 0; i < n; i++ ) { for( int k = 0; k < l[ i ]; k++ ) { cout << tab[ i ][ k ] << " "; } cout << endl; } }
void delete_matrix( int **& tab, int & n ) { for( int i = 0; i < n; i++ ) { delete[] tab[ i ]; } delete[] tab; }
int main() { int lenght[ 10 ] = { 0 }; int n; cin >> n; int stala = 10; Liczby * tablica; read_vector( tablica, n ); fibonaci( n, tablica ); ostatnia_cyfra( n, tablica, lenght ); int ** t; read_matrix( t, stala, tablica, lenght ); fill_matrix( t, stala, lenght, tablica, n ); display_matrix( t, stala, lenght ); delete_matrix( t, stala ); return 0; } |
|
Monika90 |
» 2015-11-25 17:23:28 dużo masz tego kodu, a ja mam tylko tyle #include <iostream> #include <tuple> #include <vector>
int main() { using Num = unsigned long long; std::vector < Num > fib_by_digit[ 10 ]; Num f0 = 0; Num f1 = 1; for( int i = 0; i < 20; ++i ) { fib_by_digit[ f0 % 10 ].push_back( f0 ); std::tie( f0, f1 ) = std::make_tuple( f1, f0 + f1 ); } for( int i = 0; i < 10; ++i ) { std::cout << i << ": "; for( const auto & n: fib_by_digit[ i ] ) std::cout << n << ' '; std::cout << '\n'; } }
|
|
michal11 |
» 2015-11-25 18:08:21 @up Z tego co zrozumiałem to trzeba zrobić coś w rodzaju macierzy a nie pojedynczy vector (no chyba, że nie rozumiem twojego kodu :/) |
|
Monika90 |
» 2015-11-25 19:01:37 Nie wiem o co chodzi w zadaniu, ale mój program wyświetla ten sam wyniki co program skullka dla 20 wyrazów ciągu. To nie jest pojedynczy wektor, ale tablica dziesięciu wektorów.
|
|
michal11 |
» 2015-11-25 19:53:34 Rzeczywiście, nie zwróciłem uwagi na początku. |
|
« 1 » |