Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Ciąg fibonacciego - wektor

Ostatnio zmodyfikowano 2015-11-25 19:53
Autor Wiadomość
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:

C/C++
#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;
}
P-140772
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.
P-140773
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?

C/C++
#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;
}
P-140784
Monika90
» 2015-11-25 17:23:28
dużo masz tego kodu, a ja mam tylko tyle
C/C++
#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';
    }
}
P-140788
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 :/)
P-140792
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.
P-140800
michal11
» 2015-11-25 19:53:34
Rzeczywiście, nie zwróciłem uwagi na początku.
P-140811
« 1 »
  Strona 1 z 1