Алгоритми для виконання операцій з довгими числами

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
ІКТА
Факультет:
ЗІ
Кафедра:
Не вказано

Інформація про роботу

Рік:
2017
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Алгоритмічні основи криптології
Група:
БІ 21

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» ІКТА кафедра БІТ З В І Т до лабораторної роботи №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; } Результати виконання програми. / Висновок У ході лабораторної роботи я вивчила способи представлення та алгоритми для виконання операцій введення-виведення, порівняння, підсумовування, віднімання довгих чисел та навчилася розробляти програмне забезпечення для реалізації перерахованих алгоритмів на комп’ютері.
Антиботан аватар за замовчуванням

28.11.2018 23:11-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!