Poszukiwanie największego okresu w tablicy binarnej ( choć nie tylko)

0

Witam
Proszę o pomoc w napisaniu programiku:

  1. posiadamy tablicę np. tb1={1,0,0,1,1,0,0,1}
  2. wyznaczamy okres dla tb1 -> tutaj 4
    oraz przypadek uzupełnienia
  3. posiadamy tablicę np. tb1={1,0,0,0,1,0,0} + {0}
    4 . wyznaczamy okres dla tb1 -> tutaj też 4

a dokładniej :
tab1 to tabela bitów ( choć generalnie może to być też tabela znaków, ale ograniczmy się do bitów)

ZAGADNIENIE GŁÓWNE

zamieniając liczbę ( dziesiętną) 153 na dwójkową otrzymamy 10011001.

pod pojęciem okresu rozumiem :

długość ciągu bitów który się powtarza np.:

(dec)2457=(bin)100110011001

100110011001-> 100110011001 ->100110011001

okres 4 ->bity 1001

program ma zwrócić wartość 4 - czyli wielkość okresu

PRZYPADEK UZUPEŁNIENIA

(dec)17=(bin)10001

możemy dodawać znak nie zmieniający wartości czyli '0' na końcu w celu uzyskania okresu

tutaj możemy dodać aż 3 '0'

(dec)17=(bin)10001=(bin)10001000 -> 10001000 ->10001000

okres 4 ->bity 1000

program ma zwrócić wartość 4 - czyli wielkość okresu
0

a w tym programiku z czym konkretnie masz problem?

0

Napisałem coś takiego i nie działa mi poprawnie metoda faza, pozostałe są ok, oraz nie mogę dopatrzeć się gdzie zrobiłem błąd

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;
class d2b{
private:
public:
    vector<int> bin;

    void set( int i){
        bin.clear();
        while(i!=0){
            bin.push_back(i%2);
            i/=2;
        }
        return ;
    };
    int bin2dec() const{
        int res=0;
        for (int i =0; i<bin.size(); i++){
            res=res+pow(2,i)*bin[i];
        }
        return res;
    };
    d2b(int n=0){
        while(n!=0){
            bin.push_back(n%2);
            n/=2;
        }
    };
    int faza()const {
        int res;
        int l=bin.size();
        bool ok;
        for (int f = 1; f < l; f++) {
            ok = false;
            for (int i = 0; i < l - f; i++) {
                if (bin[i] == bin[i + f]) {
                    ok = true;
                }
            }
            if (ok) {
                res= f;
            }else{
                res=0;
            }
        }
        return res;
    };    int size()const{
        return bin.size();
    };
// FRIEND
    friend ostream & operator<<(ostream &o, const d2b& obj);
};
ostream & operator<<(ostream &os, const d2b & obj){
    os<< "Numer="<<obj.bin2dec();
    os<< " Size="<<obj.size()<< " BIN=";
    for (unsigned int idx=0; idx<obj.bin.size(); idx++)
        os <<obj.bin[idx];
    os << " Faza="<<obj.faza()<< endl;
    return os;
}
int main()
{
    d2b ob(1005);
    cout << ob << endl;
    for(int i =0; i<512; i++){
        ob.set(i);
        cout << ob;
    }
    return 0;
}


```.
1

Definicję

 długość ciągu bitów który się powtarza np.:

podał prowadzący, czy to jest Twoja uproszczona wersja?
Jeśli prowadzący, to są kłopoty, bo definicja jest nieprecyzyjna.
Czy 10 w ciągu 101011 się powtarza i okresem jest 2?
Co jest okresem w ciągu 1001100110011001, 4 czy 8?

0
 Czy 10 w ciągu 101011 się powtarza i okresem jest 2?

nie, bo w 3 okresie się nie sprawdza.

 Co jest okresem w ciągu 1001100110011001, 4 czy 8?

4 - wybieramy najmniejszy okres, bo każda całkowita wielokrotność okresu jest też okresem

0

rozwiązałem problem, ale chciałbym "poprawić kod" tzn żeby program wykorzystywał bardziej szablony ( zaróbno liczby jak i okresy były zapisane w vectorach) oraz żeby były funktory.
Proszę o dalszą pomoc

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;
class d2b{
private:
vector<int> bin;
bool faza_test(int f)const {
    bool rest=true;
     for (int i = 0; i < bin.size() - f; i++){
        rest=true;
        if (bin[i] != bin[i + f]) {
            rest=false;
            break;
        }
     }
    return rest;
}
public:
    //int number;


    void set( int i){
        //i;
        bin.clear();
        while(i!=0){
            bin.push_back(i%2);
            i/=2;
        }
        return ;
    };
    int bin2dec() const{
        int res=0;
        for (int i =0; i<bin.size(); i++){
            res=res+pow(2,i)*bin[i];
        }
        return res;
    };
    d2b(int n=0){
        //number=n;
        while(n!=0){
            bin.push_back(n%2);
            n/=2;
        }
    };
    int faza()const {
        int res=0;
        int l=bin.size();
        bool ok;
        for (int f = 1; f < l; f++) {
             ok=true;
            for (int i = 0; i < bin.size() - f; i++){
                ok=true;
                if (bin[i] != bin[i + f]) {
                    ok=false;
                break;
            }
            }
            if (ok) {
                res= f;
                break;
            }
        }
        return res;
    };
    int size()const{
        return bin.size();
    };
// FRIEND
    friend ostream & operator<<(ostream &o, const d2b& obj);
};
ostream & operator<<(ostream &os, const d2b & obj){
    os<< "Numer="<<obj.bin2dec();
    os<< " Size="<<obj.size()<< " BIN=";
    for (unsigned int idx=0; idx<obj.bin.size(); idx++)
        os <<obj.bin[idx];
    os << " Faza="<<obj.faza()<< endl;
    return os;
}
int main()
{
    d2b ob(1005);

    for(int i =0; i<32; i++){
        ob.set(i);
        cout << ob;
    }

    return 0;
}



1

Napisz pseudokod funkcji main() pokazujący co chcesz uzyskać.
Uwagi do programu:

  1. Nazywaj zmienne nieco dłużej. Paskudnie się teraz to czyta.
  2. Jeśli dobrze zrozumiałem zadanie to Twoim kontenerem lepiej żeby był bitset a nie vector.
  3. Masz trochę błędów w pętlach. Zamiast typu int, stosuj typ size_t zawsze gdy zwracany jest X.size()
0

ad 1 kiedyś jedna osoba która pomagała mi ruszyć z programowaniem robiła jeszcze większe skróty - cóż nabrałem złego nawyku
ad 3 , wystarczyło zamienić int w pętlach na właśnie size_t i wszystkie ostrzeżenia zniknęły - WIELKIE DZIĘKI

ad 2. problem jest taki że w zadaniu mam obowiązkowa zastosować vector'y
vector<???> BIN- do przechowania liczb w postaci binarnej
vector <??> PHASE - do przechowywania okresów odpowiednich wartości binarnych

Kompletnie nie wiem jak to rozgryźć a dopytać się o szczegóły teraz nie mogę

0

Witam ponownie
Nadal mam problem z tym zadaniem
dokładnie chodzi mi o funkcję określającą okres tablicy binarnej, to co przedstawiam poniżej nie zawsze dobrze działa i tu proszę o pomoc!!

//bin - tablica int[32]
//roz - długość liczby binarnej

  bool dlaf(int f)const{
        bool ok = true;
        for( int i=0; i<(roz-f+1); i++){
            if((i+f)>(roz+1)){
                ok=false;
                break;
            }
            if(((i+f)==(roz+1))&&(bin[i]==0)){
                break;
            }else{
                if(bin[i]!=bin[i+f]){
                    ok=false;
                    break;
                }
            }

        }
        return ok;
    }
    int phaze()const {
        for(int f=1; f<roz/2+1; f++){
            if(dlaf(f)==true){
                return f;
            }
        }
        return 0;
    }

Problem polega na tym że NIE POTRAFIĘ czegoś dostrzec,
np

 Numer=255 Size=8 BIN=11111111 Faza=0

Powinno dać fazę=1

a

 Numer=5 Size=3 BIN=101 Faza=0

fazę=2

a czasami daję wyniki dobra np:

 Numer=146 Size=8 BIN=01001001 Faza=3

Rozbudowa zadania o kontenery ( vectory ) to "koncepcyjnie zadanie rozwiązałem przy użyciu lambd ogólny schemat poniżej ( ale brakuje mi rozwiązania dla określenia okresu)

    vector<int> dz;//przechowuje liczby dziesiętne
    vector<int> ph;// przechowuje okresy tych liczb dziesiętnych

    
   // przetwarzanie

    for_each(dz.begin(), dz.end(), [&](int x){ph.push_back(phaza(x)) ;});

1 użytkowników online, w tym zalogowanych: 0, gości: 1