Algorytmy w C++ dla opornych! 02.10.2011 Opracował: Krzysztof Rudlicki W-ce przewodniczący SKN TeamBit krudlicki@future-processing.com
O czym będę przynudzał: O - Dlaczego będę przynudzał? O - Vector A co to takiego? I po co mi to? O - cmath Kilka ciekawostek O - algorithm Czy potrzebne mi książki? O - numeric czy ktoś to zna? O - Odpowiedź na pierwsze pytanie! O - Chyba koniec... chyba...
Dlaczego będę przynudzał? O Staropolskie przysłowie głosi: Lepiej nosić niż się prosić
Nie Nosimy! #include <cstdio> #include <vector> #include <algorithm> #include <cmath> #include <numeric> using namespace std; double l[11]; int solve(int a, int b) { if(b == 1) return a; if(a == 1) return 1; int main() { for(int i=1; i<11; ++i) l[i] = log10(i); } while(true){ int a, b; scanf("%d%d", &a, &b); if(a == 0 && b == 0) break; printf("%d\n", solve(a,b)); } return 0; double x = l[a] * (double)b; x = x - floor(x); for(int i=1; i<10; ++i){ if(x < l[i+1]) return i; } } return 9;
#include <Vector> O Rozbudowana wersja standardowej tablicy! O Dowolność typów O Większe możliwości! O Kilka rodzajów konstruktorów. O Obudowane mechanizmy modyfikujące! O Clear(); O Swap(); O Itp. O Łatwość w użyciu O vector < int > tab(20);
#include <vector> - przyłady Int n; vector<int> tab; // deklaracja vektora cin >> n; for( int i = 0; i < n; ++i ) { int element; cin >> element; tab.push_back(element); // dodanie elementu na koniec tablicy }
#include <vector>
#include <vector> Dostęp: Inne:
Pobudka!!! Nie spać!!!
#include <cmath> O Biblioteka oferuje zestaw funkcji służących do wykonywania operacji matematycznych. Do używania funkcji zawartych w tej bibliotece potrzebny jest nagłówek. #include <cmath>
#include <cmath> O Ceil () zaokrąglenie liczby w górę O Floor() zaokrąglenie liczby w dół O Round() zaokrąglenie naturalne. O Fabs() wartość bezwzględna z double. O Pow() podnosi do potęgi O fmod() zwraca resztę z dzielenia x przez y O Makra O M_E - Stała Eulera e. O M_PI - Stała matematyczna pi (π).
Przykłady wykorzystania
Pobudka!!! Nie spać!!!
#include <algorithm> O Operacje Niemodyfikujące O Operacje Szukające O Operacje Modyfikujące O Operacje Zmieniające Kolejność O Operacje Sortujące O Operacje na zbiorze O Operacje Min Max O Operacje Numeryczne
Operacje Niemodyfikujące O for_each wykonuje operację na każdym elemencie ciągu O count liczy ilość wystąpień danej wartości w ciągu O count_if zlicza w ciągu ilość wystąpień wartości spełniających warunek O equal określa czy dwa zbiory elementów są takie samea
Przykład wykorzystania
Operacje Szukające O O O O O O O mismatch znajduje pierwszą parę różnych elementów dwóch ciągów O find znajduje pierwsze wystąpienie wartości w ciągu find_if znajduje w ciągu pierwsze wystąpienie wartości spełniającej warunek find_end znajduje ostatnie wystąpienie ciągu jako podciągu find_first_of znajduje jakikolwiek element ze zbioru w danym ciągu adjacent_find znajduje sąsiadującą parę wartości search znajduje pierwsze wystąpienie ciągu jako podciągu search_n znajduje pierwsze wystąpienie ciągu n-tu wartości w ciągu
Przykład wykorzystania
Operacje Modyfikujące O copy kopiuje elementy jednego ciągu do drugiego O fill zastępuje elementy ciągu podaną wartością O generate zastępuje elementy ciągu wartościami będącymi wynikiem funkcji O transform wykonuje podaną funkcję dla argumentów ze zbioru i zapisuje wyniki w nowym ciąg O remove usuwa elementy o podanej wartości O remove_if usuwa elementy spełniające warunek O replace zastępuje elementy o danej wartości inną wartością O replace_if zastępuje elementy spełniające warunek
Przykład wykorzystania
Operacje Zmieniające Kolejność O partition umieszcza elementy spełniające warunek przed tymi które go nie spełniają O random_shuffle w losowy sposób zmienia kolejność elementów ciągu O reverse odwraca kolejność elementów w ciągu O rotate dokonuje rotacji elementów ciągu O unique usuwa powtórzenia, w taki sposób że wśród sąsiadujących elementów nie ma dwóch takich samych O swap zamienia ze sobą dwa elementy
Przykład wykorzystania
Operacje Sortujące O sort sortuje ciąg rosnąco O partial_sort sortuje pierwsze N najmniejszych elementów w ciągu O nth_element ciąg jest podzielony na dwie nieposortowane części elementów mniejszych i większych od wybranego elementu
Przykład wykorzystania
Operacje na zbiorze O merge łączy dwa posortowane ciągi O includes zwraca prawdę jeśli pierwszy ciąg jest podciągiem drugiego O set_difference tworzy różnicę dwóch zbiorów O set_intersection tworzy przecięcie dwóch zbiorów (część wspólna) O set_symmetric_difference tworzy zbiór złożony z elementów niepowtarzających się w obu ciągach O set_union tworzy sumę zbiorów
Przykład wykorzystania
Operacje Min Max O max zwraca większy z dwoch elementów O max_element zwraca największy z elementów w ciągu O min zwraca mniejszy z elementów O min_element zwraca najmniejszy z elementów w ciągu O Operacje tworzące leksykograficzne permutacje ale tego nie będę tłumaczył za trudne!
Przykład wykorzystania
Operacje Numeryczne O accumulate sumuje ciąg elementów O inner_product oblicza iloczyn skalarny na elementach dwóch ciągów O adjacent_difference oblicza różnice pomiędzy sąsiadującymi elementami w ciągu O partial_sum oblicza sumy częściowe ciągu elementów( 1 + 2 + 3 + 4 + 5)
Przykład wykorzystania
Dlaczego przynudzałem??? O Nie nosimy! O Zamiast nosić wiemy z czego możemy skorzystać O Jesteśmy sprytniejsi od tych co noszą kiążki O Co za tym idzie mamy więcej siły O Oszczędzamy czas! O Mamy gotowe rozwiązanie w pełni zoptymalizowane gotowe do użycia!
Pytania!?
Koniec pierwszej części
Dziękuję za uwagę