Wysłany: 2011-08-26, 18:45 C++ problem z algorytmem
Mam pewien problem otóż nie mogę wykminić żadnego działającego sposobo na mój problem mam tablice(w tym wypadku są to kolejne elementy ciągu fibonaciego)
0 1 1 2 3 5 8 mój program ma mi wypisać liczby nie należące do danego ciągu dla tego przykładu było by to 4 6 i 7 .
miałem pomysł ,stworzyć pomocniczą tabele od 0 do n czyli 0,1,2,3,4,,,n i porównywać pokolei elementy z ciągiem ale wtedy wypisuje bzdury ,chciałem porównywać na zasadzie że jeśli liczba poróżnien w całym obiegu dla danej liczby jest równa ilości sprawdzanych liczb to ta liczba w niej nie wystepuje niestety prgram mi nie działa moje wypociny ...
a) kod później nie chce mi się teraz myśleć nad tym xD
b) pomysł:
1) Generujesz tablice z danym ciągiem liczb(Fibonacciego)
2) sortujesz ją od 0 do n.... to chyba masz od razu jak ja generujesz, ale w razie czego piszę;]
//3) optymalizujesz ją... tzn... wywalasz liczby powtarzające się
4) generujesz nową tablicę od 0 do N gdzie N to Twoja końcowa liczba(większa lub równa ostatniej liczbie Ciągu FIBtablica), ale Tablica jest typu BOOL, ustawiasz wszystko na True;-))))))
5) Najlepsza zabawa xD
For (int i=0; i<TablicaFib.lenght(); i++) //przelatujemy całą tablicę FIB
{
TablicaNowa[TablicaFib[i]] = False;
}
//Uważaj aby ostatnia(największa) wartość w tablicy FIB nie była większa niż ILOŚĆ elementów w NowejTablicy błąd zakresu indeksowania tablicy wyjdziesz po za zakres
6) Przeszukujesz TablicaNowa i wyświetlasz dane:
for (int i=0; i<TablicaNowa.lenght(); i++)
{
If (TablicaNowa[i] == true) Cout << i.toString();
}
----
Aha, kodu nie kopiuj, bo kurcze nie pamiętam już C++ za dobrze i chyba byki zrobiłem w warunkach gdzie pobieram długość tablicy(jej ilosć), ja bym to zrobił na liście w C# a tam jest odrobinkę inna składnia, a po za tym piszę to z głowy i jak widzisz... punkt 3 Ci za komentowałem, czyli nie obowiązuje, bo jak już raz ustawisz zmienną na False to potem drugi raz jak ustawisz znowu na False to jest to samo, a czas operacji krótszy a niżeli byś optymalizował cała tablice... hmm.. czyli tworzył nowa i usuwał starą... znowu mi się pierdykło, Lista jest automatycznie relinkowana, a tablica nie xD
powodzenia, ja wracam do pisania pracy dyplomowej, jak nie dasz rady, to daj znać ;-P postaram się o gotowca
_________________ Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...
4) generujesz nową tablicę od 0 do N gdzie N to Twoja końcowa liczba(większa lub równa ostatniej liczbie Ciągu FIBtablica), ale Tablica jest typu BOOL, ustawiasz wszystko na True;-))))))
za dobry w logice nie jestem w c++ ale jeśli utworze taka tablice i napisze np bool tablica[m] ; to tablica mimo uprzedniego wypelnienia liczbami od 0 do n przyjmie wartosci 1 jako true .
Cytat:
TablicaNowa[TablicaFib[i]] = False;
tablica od tablicy czy takie coś jest możliwe w c++ ?
i chcesz mieć tablicę o zawartości(4,6,7,9,10,11,12,14,15,16,17,18,19,20,22) tak Jeżeli tak to czytaj dalej
Bool TabNowa[30] ->Zawartość (True, [...], True) // specjalnie ustawiłem na 30, mogło by być najmniej 22 ponieważ ostatnia liczba z FIB(ostatnia w przykładzie) to 21 do tego + 1, potem wyjaśnię dlaczego.
tłumaczenie:
Od i=0; do ilości elementów tablicy(zadziała poprawnie nawet dla dynamicznych tablic) TabFIB.
Pobieramy pierwszy element tablicy TabFIB 0 jest to liczba typu INT(tak tablica została zadeklarowana)
Dalej Kompilator to co wyciągnął z TabFIB[0] wstawia jako INDEX do tablicy TabNowa[..] a tam kryje się wartość Bool, którą chcemy zmienić !
innym słowy, mamy:
Tablice o 30 elementach BOOL interesuje nas fakt iż jest to adresowana o 1, czyli 0,1,2,3,4,5,6,...29; daje nam to fakt iż pod tymi indeksami są wartości TRUE(czyli w moim[naszym] mniemaniu wszystkie te pola są AKTYWNE, że chcemy je DEZAKTYWOWAĆ, ale tylko te które odpowiadają polom CiąguFIB, więc pobieramy LICZBĘ(int) z tablicy gdzie są liczby do zdezaktywowania i wstawiamy je jako INDEX w następnej tablicy i tam ustawiamy FALSE.
Dalej, wyświetlenie tylko i wyłącznie ! numeru INDEXU z TabNowa gdzie wartość jest == True ))
Czyli de-facto nic nie usuwamy
można sobie to skojarzyć tak graficznie:
|----------------------------------------------------------
|0|1|2|3|.......................................................29| //index
|----------------------------------------------------------
|T|F|T|T|.........................................................T| //wartość bool
|----------------------------------------------------------
Gdzie pierwsza linia, to Indeksy tablicy TabNowa, a dół to wartość BOOL,
Teraz czynność: przeszukujemy Tablicę FIB i pierwsza wartość elementu to np. 1 lecimy pod Index TabNowa i dezaktywujemy ją(na rysunku ustawiona już na False) )) Wszystko.
Indeksy są zawsze od 1 do N, masz pewność że nie przeoczysz czegoś, wartość TablicyFIB zawsze będzie liczbowa.
Problem będzie tkwił jak będziesz operował na liczbach, których nie potrafimy nazwać słownie czyli rzędu 1*10^9999999999999999999
W tedy masz 2 Tablice i potrzebujesz je utrzymać równocześnie w pamięci... ale zawsze można TabFIB wrzucić na dysk i operować na dysku dla upartego Tablice Nowa też możesz wpakować do pliku... w końcu 3TB na HDD to nie to samo co 4GB RAM (tutaj mowa o jednej kości i jednym dysku - takie porównanie);-)))
Jak do jutra się z tym nie uporasz, to Ci to jutro w wolnej chwili zrobię, bo dziś już padam....
EDIT////
Kod:
// Maniek.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int n;
int *tabFIB;
bool *tabNowa;
cout << "Podaj ilosc liczb FIB: ";
cin >> n;
tabFIB = new int[n];
tabFIB[0]=0;
tabFIB[1]=1;
for (int i = 2; i < n; i++)
{
tabFIB[i]=tabFIB[i-1]+tabFIB[i-2];
}
tabNowa = new bool[tabFIB[n-1]+1];
for (int i = 0; i <= tabFIB[n-1] + 1; i++)
{
tabNowa[i] = true;
}
for (int i = 0; i < n; i++)
{
tabNowa[tabFIB[i]] = false;
}
cout << "Ciag " << n << " liczb FIB to:" << endl;
for (int i = 0; i < n-1; i++)
{
cout << tabFIB[i] << ", ";
}
cout << tabFIB[n-1] << ";" << endl;
cout << "Ciag liczb z wylaczeniem liczb FIB z zakresu 0.." << tabFIB[n-1]+1 << " to:" << endl;
for (int i = 0; i < tabFIB[n-1]; i++)
{
if (tabNowa[i] == true)
{
cout << i << ", ";
}
}
if (tabNowa[tabFIB[n-1] + 1] == true)
{
cout << tabFIB[n-1] + 1 << ";" << endl;
}
cout << "\n\n\t\t\tDziekuje za uwage ExeQtoR\n" << endl;
system("PAUSE");
return 0;
}
Podaj optymalnie do 15 liczb FIB jak podasz np. 25, to dostaniesz oczopląsu na monitorze
Program nie jest zabezpieczony przed wprowadzeniem czegoś innego a niżeli liczb całkowitych dodatnich
Da się go jeszcze uprościć komasując dwie pętle w jedną, ale tak może łatwiej Ci będzie zakapować wszystko
aj.... nie patrz na _tmain i tą tablicę... Visual 2010 tak generuje funkcję główną, Ty w innym kompilatorze zmień to ma int main()
w kodzie PL znaki specjalnie zostały wyrzucone
_________________ Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...
Dziękuję bardzo że chciało Ci się dla mnie to naskrobać przeanalizuję i spróbuję sam też napisać , ale w między czasie siedziałem trochę i też napisałem ten program ale w inny sposób mianowicie mam c.fibonaciego i 2 tablice od 0 do n sprawdzam które liczby są takie same jeśli takie znajdę zeruje je w tablicy pomocniczej i potem tą tablice wyświetlam program ladnie śmiga mianowicie mam jeden problem mam nadzieję że powiesz mi czemu go mam mianowicie
Kod:
#include <iostream>
using namespace std;
int const n=200; // rozmiar tablicy pomocniczej
int const m=50; //ilosc elementow ciagu (maxymalna)
int main()
{
int tab[n],tab1[m],size;
int _tmain(int argc, _TCHAR* argv[])
{
int n;
int *tabFIB;
bool *tabNowa;
DWORD Start, Stop;
cout << "Podaj ilosc liczb FIB: ";
cin >> n;
Start = GetTickCount(); // Po tym program wykonuje sie bez oczekiwania na usera ;-)
tabFIB = new int[n];
tabFIB[0] = 0;
tabFIB[1] = 1;
for (int i = 2; i < n; i++)
{
tabFIB[i]=tabFIB[i-1]+tabFIB[i-2];
}
tabNowa = new bool[tabFIB[n-1] + 1];
for (int i = 0; i <= tabFIB[n-1] + 1; i++)
{
tabNowa[i] = true;
}
for (int i = 0; i < n; i++)
{
tabNowa[tabFIB[i]] = false;
}
cout << "Ciag " << n << " liczb FIB to:" << endl;
for (int i = 0; i < n - 1; i++)
{
cout << tabFIB[i] << ", ";
}
cout << tabFIB[n-1] << ";" << endl;
cout << "Ciag liczb z wylaczeniem liczb FIB z zakresu 0.." << tabFIB[n-1] + 1 << " to:" << endl;
for (int i = 0; i < tabFIB[n-1]; i++)
{
if (tabNowa[i] == true)
{
cout << i << ", ";
}
}
if (tabNowa[tabFIB[n-1] + 1] == true)
{
cout << tabFIB[n-1] + 1 << ";" << endl;
}
Stop = GetTickCount(); //Program juz zakonczyl wszystkie operacje liczenia wiec pobieramy raz jeszcze date i czas ;-))
cout << "\nProgram wykonywal sie: " << Stop - Start << " milisekund";
cout << "\n\n\t\t\tDziekuje za uwage ExeQtoR\n" << endl;
system("PAUSE");
return 0;
}
Zrób tak samo ze swoim i porównaj który szybciej zadziała
_________________ Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...
działa ~~ ale tak naprawdę nie widzę logicznej różnicy xD
Jak to nie ma różnicy skoro jeden działa a drugi nie to różnica jest
mój: Pętla: Sprawdza czy wartość jest RÓŻNA od 0 jeżeli tak: COŚ...
Twój: Pętla: Sprawdza czy jest 0 jeżeli tak: Zwiększa licznik o 1 dalej pętla też go zwiększa o jeden TWÓJ BŁĄD(podwójna inkrementacja licznika)
mogę Ci to inaczej z obrazować(poprawić na Twoim):
Ten też zadziała poprawnie, a ja wcześniej w moim użyłem innego warunku: zamiast "==" użyłem "!=" a to różnica
maniek910 napisał/a:
no ale nic, teraz mi powiedz jak pobrać tą date systemową ?
Datę jak datę... znowu po co Ci wiedzieć dokładną datę po "ludzkiemu"
Wystarczy mieć datę po komputerowemu, potem druga odjąć i to co wyjdzie wyświetlić a potem porównać z drugim programem
Kod:
#include <windows.h>
int main()
{
DWORD Start, Stop;
//wczytywanie danych od usera
Start = GetTickCount();
//Liczymy.......................................
Stop = GetTickCount();
//już wszystko wyliczyliśmy i wyświetliliśmy dane ;-)
co do twojego kodu widzę że tablice są na wskaźnikach
hmmm... wskaźnik, tak ale to są tablice dynamiczne, czyli najpierw deklarujemy że mamy taką zmienną, potem ją inicjalizujemy jako tablicę o N długości, a N podaje user więc nie musisz na sztywno podawać w kodzie
Więc Tablica dynamiczna nie różni się niczym od statycznej, po za tym że dynamiczna w czasie programu jest inicjalizowana a statyczna na początku, a dalej działają identycznie zauważ że dalej już żadnego wskaźnika nie używam ;-P
_________________ Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...
Możesz pisać nowe tematy Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum