Professional Documents
Culture Documents
Przedziały liczbowe
Opracował: Andrzej Nowak
Bibliografia:
mgr Jerzy Wałaszek; Algorytmika: http://eduinf.waw.pl/inf/index.php
Mirosław Zelent; Kurs C++ Struktury danych: http://miroslawzelent.pl
Metoda brutalna (ang. brutal force) polega na przejściu przez wszystkie wartości w danym
przedziale liczbowym i sprawdzeniu każdej z nich, czy spełnia wymagane kryterium.
Jeśli tak, to znaleziona liczba jest przekazywana na wyjście.
Algorytm
wyszukiwania liczb według kryterium
Wejście
a – początek przedziału, a Z
Wyjście:
K02: Zakończ
Uwagi
Jeśli postać kryterium pozwala nam przewidzieć, obliczyć wartości, które go spełniają,
możemy zastosować inne rozwiązanie:
Wyznaczamy pierwszą liczbę w przedziale <a,b>, która spełnia kryterium.
Następnie w pętli sprawdzamy, czy wyznaczona liczba mieści się w
przedziale <a,b>.
Jeśli tak, przesyłamy ją na wyjście, po czym wyznaczamy kolejną
liczbę i wracamy na początek pętli.
Pętlę kontynuujemy, aż wygenerowana liczba wyjdzie poza przedział
<a,b>.
Algorytm
wyszukiwania liczb spełniających kryterium
Wejście
a – początek przedziału, a Z
Wyjście:
K05: Zakończ
Uwagi
Takie podejście pozwala nam wyeliminować puste przebiegi pętli – wykonuje się
ona tylko tyle razy, ile jest potrzebne na wygenerowanie liczb spełniających
kryterium.
W efekcie algorytm działa dużo szybciej.
W pewnych sytuacjach możemy nawet obniżyć klasę czasowej złożoności
obliczeniowej poniżej O(n).
Wadą rozwiązania jest konieczność analizy problemu, co czasami może
być bardzo trudne.
Przedziały liczbowe
liczby parzyste i nieparzyste
Problem
W przedziale całkowitym <a,b> wyszukaj wszystkie liczby parzyste.
Liczby parzyste
W wielu algorytmach musimy wygenerować liczby parzyste z zadanego przedziału
<a,b> liczb całkowitych.
Tego typu zadanie rozwiązujemy stosując podejście nr 2.
Ponieważ granice przedziału a i b mogą być dowolnymi liczbami całkowitymi,
musimy najpierw znaleźć najmniejszą liczbę parzystą z przedziału <a,b>.
i = a
Jeśli reszta z dzielenia a przez 2 jest różna od 0, to zwiększ i o 1
a – początek przedziału, a Z
Wyjście:
Jeśli a mod 2 ≠ 0,
K02:
to i ← i + 1
Dopóki i ≤ b,
K03: ; generujemy liczby parzyste w przedziale <a,b>
wykonuj kroki K03...K04
K06: Zakończ
Program
// Liczby parzyste
//----------------------------
#include <iostream>
int main()
{
int a,b,i;
Liczby nieparzyste
Liczby nieparzyste generujemy w identyczny sposób:
wyznaczamy pierwszą liczbę nieparzystą w przedziale <a,b>,
kolejne są o 2 większe.
Jeśli a jest nieparzyste, to pierwsza liczba nieparzysta jest równa a,
w przeciwnym razie jest o 1 większa.
Program
// Liczby nieparzyste
//----------------------------
#include <iostream>
int main()
{
int a,b,i;