You are on page 1of 9

Podstawy programowania w C++

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

Przedziały liczbowe i liczby


W informatyce operuje się na liczbach, które z założenia znajdują się w jakiś
przedziałach liczbowych. Ograniczenie to wynika z możliwości obliczeniowych sprzętu.
Wyszukiwanie liczb polega na znajdowaniu takich liczb, które spełniają pewne kryteria.
Znalezione liczby mogą być później wykorzystywane w charakterze danych
wejściowych dla algorytmów wyższego poziomu.
Istnieją zasadniczo dwa podejścia do rozwiązania problemu.
Podejście pierwsze

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

b – koniec przedziału, b Z, a < b

Wyjście:

Liczby z przedziału <a,b>, które spełniają zadane kryterium


Dane pomocnicze:

i – kolejne liczby w przedziale <a,b>, i Z


Lista kroków:
K01: Dla i = a, a+1, ..., b ; tworzymy pętlę przechodzącą przez kolejne wartości w
przedziale
wykonuj:
; testujemy kolejną liczbą. Jeśli spełnia kryterium, to
Jeśli i spełnia kryterium,
przekazujemy ją na wyjście
to pisz i

K02: Zakończ

Uwagi

Podejście brutalne stosujemy zwykle w początkowej fazie projektowania algorytmu.


Jeśli kryterium nie zależy od ilości liczb w przedziale, to metoda posiada klasę czasowej
złożoności obliczeniowej równą O(n).
 Zaletą jest prostota algorytmu.
 Wadą jest konieczność testowania wszystkich liczb w przedziale.
Podejście drugie

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

b – koniec przedziału, b Z, a < b

Wyjście:

Liczby z przedziału <a,b>, które spełniają zadane kryterium


Dane pomocnicze:

i – liczby w przedziale <a,b> spełniające kryterium, i Z


Lista kroków:
K01: i ← pierwsza liczba w <a,b> spełniająca ; ustalamy początkową wartość
kryterium

K02: Dopóki i ≤ b, ; tworzymy pętlę generującą wynikowe


liczby w <a,b>
wykonuj kroki K03...K04

K03: Pisz i ; wyprowadzamy liczbę spełniającą


kryterium

K04: i ← następna liczba spełniająca ; wyznaczamy następną liczbę


kryterium

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>.

 Jeśli a jest parzyste, to najmniejszą liczbą parzystą w tym przedziale będzie


właśnie a.
 Jeśli a nie jest parzyste, to najmniejszą liczbą parzystą będzie a + 1.

Parzystość a sprawdzimy badając resztę z dzielenia a przez 2.


 Jeśli reszta jest zerowa, to a jest liczbą parzystą.
 Jeśli a nie jest liczbą parzystą, to

1. Reszta wynosi 1 dla a > 0


2. Reszta wynosi -1 dla a < 0

Z powyższego wnioskujemy, że pierwszą liczbę parzystą w przedziale całkowitym


<a,b> otrzymamy następująco:

i = a
Jeśli reszta z dzielenia a przez 2 jest różna od 0, to zwiększ i o 1

Następna liczba parzysta jest zawsze o 2 większa.


Podsumowując otrzymujemy następujący, prosty algorytm generacji liczb parzystych
w przedziale całkowitym <a,b>:
Algorytm
generacji liczb parzystych
Wejście

a – początek przedziału, a Z

b –koniec przedziału, b Z, a < b

Wyjście:

Kolejne liczby parzyste zawarte w przedziale <a,b>


Zmienna pomocnicza

i – przebiega przez kolejne liczby parzyste w przedziale <a,b>, i Z


Lista kroków:
K01: i ← a ; obliczamy pierwszą liczbę parzystą

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

K04: Pisz i ; wyprowadzamy liczbę parzystą

K05: i ← i + 2 ; następna liczba parzysta

K06: Zakończ
Program

Program spodziewa się w pierwszym wierszu liczb a i b.


W kolejnych wierszach wyświetla liczby parzyste zawarte w przedziale <a,b>.

// Liczby parzyste
//----------------------------

#include <iostream>

using namespace std;

int main()
{
int a,b,i;

cin >> a >> b;


i = a;
if(a % 2) i++;
while(i <= b)
{
cout << i << " ";
i += 2;
}
cout << endl;
return 0;
}

Przykładowe wyniki wywołania programu

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

Program czyta krańce przedziału a, b i wyświetla wszystkie kolejne liczby nieparzyste


zawarte w tym przedziale.
Program spodziewa się w pierwszym wierszu liczb a i b.

// Liczby nieparzyste
//----------------------------

#include <iostream>

using namespace std;

int main()
{
int a,b,i;

cin >> a >> b;


i = a;
if(a % 2 == 0) i++;
while(i <= b)
{
cout << i << " ";
i += 2;
}
cout << endl;
return 0;
}

Przykładowe wyniki wywołania programu

You might also like