You are on page 1of 7

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ


«КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ ІМЕНІ ІГОРЯ
СІКОРСЬКОГО»
ІНСТИТУТ ПРИКЛАДНОГО СИСТЕМНОГО АНАЛІЗУ
Кафедра математичних методів системного аналізу

ПРОТОКОЛ
про виконання лабораторної роботи № 2
з дисципліни «Алгоритми та системи даних»
Дослідження базових алгоритмів

Виконала:
студентка 1 курсу
групи KА-18
Рачинська Л.А.

Київ – 2021
Мета роботи

Ознайомитись і дослідити базові класичні алгоритми: пошук простих


чисел, переведення числа з однієї системи числення в іншу, рекурсивні
алгоритми. Набути навичок їх реалізації мовою програмування С/C++,
навчитися вимірювати та порівнювати швидкодію алгоритмів.

Варіант 21

Хід виконання роботи

Задача 1.

Знайти суму всіх двоцифрових простих чисел.

1) Реалізувати булеву функцію bool isPrime(int n), яка перевіряє


вхідне число n на простоту за допомогою звичайного перебору дільників.

2) Реалізувати алгоритм “Решето Ератосфена” для знаходження всіх


простих чисел на проміжку від 1 до N.

3) Розв’язати задану задачу у 2 способи: за допомогою функції


isPrime() та за допомогою решета Ератосфена, заміряти та вивести час
виконання кожного рішення.
Код програми:
#include <iostream>
#include <time.h>
#include <cmath>
#include <iomanip>

using namespace std;

bool isPrime(int n) //перевірка числа на простоту


{
if (n <= 1)
return false;
if (n == 2)
return true;
for (int i = 2; i < n; i++)
{
if (n % i == 0)
return false;
}
return true;
}

void errat(bool err[], int max, int min) // решето Ератосфена + масив
{
int i, j;
for (j=2; j<=max; j++)
err[j]=true;
j=2;
while (j*j<=max)
{
i=j*j;
if (err[j])
while (i<=max)
{
err[i]=false;
i=i+j;
}
j=j+1;
}
for (j=min; j<=max; j++)
{
if (err[j]==true)
cout<<j<<'\t';
}
}

int main()
{
int sum=0, size=0, i=0, min=10, max=99, sumer=0;
bool a;

for (int n=10;n<=99; n++) //обчислення розміру масиву


{
if(isPrime(n))
size++;
}
int *arr=new int [size];

for (int n=10; n<=99; n++) //заповнення масиву


{
if(isPrime(n))
arr[i++]=n;
}

cout<<setw(45)<< "bool isPrime"<<endl;


for (int i=0; i<size; i++) //виведення масиву
{
cout<<arr[i]<<'\t';
}
cout<<endl;

clock_t start = clock();


for (int n=10; n<=99; n++) //сума усіх двоцифрових простих чисел
{
a=isPrime(n);
if (a==true)
sum+=n;
}
clock_t end = clock();
double seconds = (double(end - start)) / CLOCKS_PER_SEC;
cout<<"Сума: "<<sum<<endl;
cout<<"Час виконання: "<<seconds<<endl;
cout<<endl;

cout<<setw(63)<<"Решето Ератосфена"<<endl;

bool *err=new bool[max];


errat(err, max, min);
cout<<endl;
clock_t start1 = clock();
for (int j=min; j<=max; j++)
{
if (err[j]==true)
sumer+=j;
}
clock_t end1 = clock();
double seconds1 = (double(end1 - start1)) / CLOCKS_PER_SEC;
cout<<"Сума: "<<sumer<<endl;
cout<<"Час виконання: "<<seconds1<<endl;

return 0;
}
Задача 2.
Написати функцію для переведення натурального десяткового числа в 5-
ву систему числення, і функцію для зворотнього переведення. Протестувати
на декількох прикладах

Код програми:
#include <iostream>
#include <cmath>
using namespace std;

int dectosys(int decimal)


{
const int base = 5;
int res=0, i=0;
while (decimal>0) {
res+=(decimal%base)*pow(10, i);
decimal /= base;
i++;
}
return res;
}

int systodec(int fifth)


{
const int base = 5;
int res=0, i=0;
while(fifth>0)
{
res += (fifth % 10) * pow(base, i);
fifth /= 10;
i++;
}
return res;
}

int main()
{
int num;
cout << "Введіть число: ";
cin >> num;

cout << "З 10-вої у 5-ву: "<<dectosys(num) << endl;


cout << "З 5-вої у 10-ву: "<<systodec(num) << endl;

return 0;
}

Задача 3.
Дано натуральне число N. Вивести всі його цифри по одній, розділяючи
їх пробілами або новими рядками, за допомогою рекурсії.

Код програми:
#include <iostream>
#include <string>
using namespace std;

void digits(int n)
{
if (n)
digits(n / 10);
else
return;
cout << n % 10<<'\t';
}

int main()
{
int n;
cout<<"N=";
cin>>n;
digits(n);
cout<<endl;
}
ВИСНОВКИ

В ході виконання лабораторної роботи «Дослідження базових алгоритмів»


були виконані завдання, що вимагали вивчення та застосування базових
алгоритмів мови С++. Для розв’язку першої задачі було досліджено та
реалізовано роботу двох алгоритмів пошуку простих чисел: перебір та
«Решето Ератосфена», отримані числа із заданого проміжку було занесено до
цілочисельного масиву та обчислено їхню суму. Для порівняння роботи двох
алгоритмів було виміряно швидкість їхнього виконання, з чого отримали
висновок, що алгоритм «Решето Ератосфена» виконує поставлену задачу
швидше. Задля розв’язку другої задачі опрацювали методи переведення
чисел між різними системами числення та перевірили роботу коду на
декількох прикладах. У третій задачі ознайомилися з поняттям «рекурсія» та
використали рекурсивний алгоритм задля знаходження всіх цифр
натурального числа та виведення їх, розділяючи відступами.

You might also like