МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра БІТ
З В І Т
до лабораторної роботи №1
з курсу: «Алгоритмічні основи криптології»
на тему: «Алгоритми для
виконання операцій з довгими числами»
Варіант 9
Мета роботи
Вивчити способи представлення та алгоритми для виконання операцій введення-виведення, порівняння, підсумовування, віднімання довгих чисел та навчитися розробляти програмне забезпечення для реалізації перерахованих алгоритмів на комп’ютері.
Завдання
Скласти блок-схеми алгоритмів та підпрограми для реалізації операцій введення та виведення довгих чисел. Скласти блок-схеми алгоритмів, підпрограми та програму для реалізації адитивних операцій та операцій порівняння для роботи з довгими числами.
/
Блок-схема алгоритму
/
/
/
Список ідентифікаторів констант, змінних, процедур і функцій, використаних в програмі, та їх пояснення
convert_to_long_var – функція, що перетворює введені дані у довге число;
Sub – функція, що додає два довгих числа;
long_var1 та long_var2 – змінні, які містять у собі довгі числа;
basis – основа позиційної системи числення;
Simile – функція, що виконує порівняння;
Текст програми
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
int* convert_to_long_var(int*, string, int);
int* Sub(int*, int*, int*, int);
bool Simile(int*, int*, int);
void main() {
setlocale(LC_CTYPE, "Ukrainian");
string numb1, numb2;
int *long_var1 = new int;
int *long_var2 = new int;
cout << "n1: "; getline(cin, numb1);
cout << "n2: "; getline(cin, numb2);
int basis;
cout << "basis: "; cin >> basis;
cout << endl;
long_var1 = convert_to_long_var(long_var1, numb1, basis);
cout << endl;
long_var2 = convert_to_long_var(long_var2, numb2, basis);
for (int i = 1; i < long_var1[0] + 1; i++) {
cout << long_var1[i] << ' ';
}
cout << endl << endl;
for (int i = 1; i < long_var2[0] + 1; i++) {
cout << long_var2[i] << ' ';
}
cout << endl << endl;
if (Simile(long_var1, long_var2, basis) == true) cout << "Числа рiвнi" << endl;
else cout << "Числа не рiвнi" << endl;
int *res_long_var = new int;
res_long_var = Sub(long_var1, long_var2, res_long_var, basis);
cout << endl << "Сума = ";
for (int i = 1; i < res_long_var[0] + 1; i++) {
cout << res_long_var[i] << ' ';
}
_getch();
}
int* convert_to_long_var(int *long_var, string numb, int basis) {
int osn = 0;
while (basis % 10 != 1) {
basis /= 10;
osn++;
}
int size_numb = numb.size();
int quantity, zero;
if (size_numb % osn != 0) {
quantity = (size_numb / osn) + 1;
zero = osn - (size_numb % osn);
}
else {
quantity = size_numb / osn;
zero = 0;
}
char *tmp = new char[osn];
long_var = new int[quantity + 1];
long_var[0] = quantity;
for (int i = 1; i <= quantity; i++) {
if (i == quantity) {
int j = 0;
for (; j < zero; j++) {
tmp[j] = '0';
}
for (; j < osn; j++) {
tmp[j] = (char)numb[size_numb - osn*i + j];
}
long_var[quantity - i + 1] = atoi(tmp);
for (int t = 0; t < osn; t++) { tmp[t] = ' '; }
}
else {
for (int k = 0; k < osn; k++) {
tmp[k] = (char)numb[size_numb-osn*i + k];
}
long_var[quantity - i + 1] = atoi(tmp);
for (int t = 0; t < osn; t++) { tmp[t] = ' '; }
}
}
return long_var;
}
int* Sub(int *long_var1, int *long_var2, int *res_long_var, int basis) {
int size1 = long_var1[0] + 1;
int size2 = long_var2[0] + 1;
int size_max, size_min;
int *tmp;
int counter = 0;
while (basis % 10 != 1) {
basis /= 10;
counter++;
}
char *_max = new char[counter];
for (int i = 0; i < counter; i++) _max[i] = '9';
int max = atoi(_max); //максимальне число в 1 розряді
if (size1 >= size2) {
res_long_var = long_var1;
tmp = long_var2;
size_max = size1;
size_min = size2;
}
else {
res_long_var = long_var2;
tmp = long_var1;
size_max = size2;
size_min = size1;
}
int remainder = 0;
for (int i = 1; i < size_min; i++) {
res_long_var[size_max - i] += tmp[size_min - i] + remainder;
remainder = 0;
if (res_long_var[size_max - i] > max) {
res_long_var[size_max - i] -= (max + 1) ;
remainder = 1;
}
if (i == size_min-1 && res_long_var[size_max - i] == max && remainder == 1) {
for (int i = 1; i < size_min; i++) {
res_long_var[size_max - i + 1] = res_long_var[size_max - i];
}
res_long_var[1] = 1;
res_long_var[0]++;
return res_long_var;
}
if (i == size_min - 1 && remainder == 1) {
res_long_var[size_max - i - 1] += 1;
}
}
return res_long_var;
}
bool Simile (int *long_var1, int *long_var2, int basis) {
int size = long_var1[0] + 1;
for (int i = 0; i < size; i++)
if (long_var1[i] != long_var2[i]) return false;
return true;
}
Результати виконання програми.
/
Висновок
У ході лабораторної роботи я вивчила способи представлення та алгоритми для виконання операцій введення-виведення, порівняння, підсумовування, віднімання довгих чисел та навчилася розробляти програмне забезпечення для реалізації перерахованих алгоритмів на комп’ютері.