DevioLab CRYPTO TRADING AUTOMATION
LIVE
AUTOMATED CRYPTO TRADING • BINANCE
Автоматизуйте свій криптопортфель
Торгові боти DevioLab аналізують крипторинок, автоматично відкривають і закривають позиції та керують вашим портфелем на Binance 24/7.
CRYPTO 80 Bots
BINANCE Spot Trading
TRADING 24 / 7
Спробувати DevioLab
deviolab.com

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

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

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

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

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

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

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” ІКТА кафедра БІТ  Звіт до лабораторної роботи № 1 з дисципліни "Алгоритмічні основи криптології" по темі : "Алгоритми для виконання операцій з довгими числами" Варіант 13 Мета роботи - вивчити способи представлення та алгоритми для виконання операцій введення-виведення, порівняння, підсумовування, віднімання довгих чисел та навчитися розробляти програмне забезпеченнядля реалізації перерахованих алгоритмів на комп’ютері. 1. ЗАВДАННЯ 1) Вивчити основні способи представлення довгих чисел та алгоритми для реалізації операцій введення, виведення, порівняння, а також арифметичних операцій додавання-віднімання довгих чисел. 2) Скласти блок-схеми алгоритмів та підпрограми для реалізації операцій введення та виведення довгих чисел. Варіанти представлення довгих чисел та способи заповнення невикористаних розрядів беруться за вказівкою викладача. 3) Скласти блок-схеми алгоритмів, підпрограми та програму для реалізації адитивних операцій та операцій порівняння для роботи з довгими числами. Дані для роботи беруться з таблиці 5 за вказівкою викладача. № з/п Варіант представлення числа Заповнення невикористаних розрядів Операції з довгими числами  13 1 0 Віднімання, більше   2. Блок-схеми алгоритмів / Рис.1. Блок-схема алгоритму введення довгого числа. / Рис.2. Алгоритм виведення довгого числа. /Рис.3. Блок-схеми алгоритмів порівняння довгих чисел. / Рис.5. Блок-схема алгоритму віднімання довгих чисел. 3. Список ідентифікаторів констант, змінних, процедур і функцій, використаних у блок-схемах алгоритмів і програм, та їх пояснення i, ind - змінна цілого типу, індекс масиву r_size - змінна цілого типу, різниця к-сті цифр більшого числа від меншого size - змінна цілого типу, загальний розмір чисел n - змінна цілого типу, розмір першого числа m - змінна цілого типу, розмір другого числа m1 - змінна логічного типу, від'ємність першого числа m2 - змінна логічного типу, від'ємність другого числа ch1 - масив символьного типу, перше число зі знаком ch2 - масив символьного типу, друге число зі знаком temp1 - масив символьного типу, перше число без знаку temp2 - масив символьного типу, друге число без знаку res_sign - змінна символьного типу, знак результату c1 - масив цілого типу, перше число без знаку c2 - масив цілого типу, друге число без знаку result - масив цілого типу, результат операції r - масив цілого типу, результат віднімання res - змінна цілого типу, цифра результат віднімання st - змінна цілого типу, перехід в старший розряд a - масив цілого типу, результат додавання res - змінна цілого типу, цифра результат додавання st - змінна цілого типу, перехід в старший розряд test_tia - масив цілого типу, конвертований з масиву символьного типу tid - змінна цілого типу, конвертована з змінної символьного типу test - масив символьного типу, конвертований з текстової стрічки q, k - змінні цілого типу, розміри першого і другого числа str1 - змінна текстового типу, стрічка з першим числом str2 - змінна текстового типу, стрічка з другим числом ln - обєкт з доступом до класу LongNumbers Crypto_Lab1 - простір імен LongNumbers - клас, котрий реалізує операції з довгими числами Program - клас, котрий контролює програму LongNumbers() - конструктор, котрий перероблює дані для подальшого виконання операції з числами Actions() - функція, котра виконує операцію над довгими числами Substract() - функція повертає масив цілого типу, котра реалізує операцію віднімання довгих чисел Add() - функція повертає масив цілого типу, котра реалізує операцію додавання довгих чисел ShowResult() - функція, виводить на екран остаточний результат операцій з довгими числами ToIntArray() - функція повертає масив цілого типу, котра конвертує значення з символьного масиву в цілочисельний масив ToIntDigit() - функція повертає значення цілого типу, котра конвертує символьне значення змінної в цілочисельне ToChar() - функція повертає масив символьного типу, котра реалізує перетворення з текстової стрічки в масив символьних елементів Over() - функція повертає значення логічного типу, котра реалізує порівняння двох довгих чисел, чи одне більше за друге Equally() - функція повертає значення логічного типу, котра реалізує порівняння двох довгих чисел на рівність одне одному Main() - головна функція Console.Write() - функція, виводить на екран текст Console.WriteLine() - функція, виводить на екран текстову стрічку Console.ReadLine() - функція зчитує з клавіатури текст Array.Copy() - функція, котра копіює значення з одного масиву в інший 4. Текст програми using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Crypto_Lab1 { class LongNumbers { int i = 0, ind = 0; int r_size; int size = 0; int n, m; bool m1 = false, m2 = false; char[] ch1, temp1; char[] ch2, temp2; char res_sign = ' '; int[] c1; int[] c2; int[] result; public LongNumbers(string str1, string str2) { n = str1.Length; m = str2.Length; ch1 = new char[n]; ch2 = new char[m]; ch1 = ToChar(str1); ch2 = ToChar(str2); if (ch1[0] == '-' && ch2[0] == '-') { m1 = true; m2 = true; } else if (ch1[0] == '-') m1 = true; else if (ch2[0] == '-') m2 = true; else { m1 = false; m2 = false; } if (m1 && !m2) { temp1 = new char[ch1.Length - 1]; for (i = 0; i < temp1.Length; i++) temp1[i] = ch1[i + 1]; temp2 = new char[ch2.Length]; Array.Copy(ch2, temp2, ch2.Length); } else if (m2 && !m1) { temp2 = new char[ch2.Length - 1]; for (i = 0; i < temp2.Length; i++) temp2[i] = ch2[i + 1]; temp1 = new char[ch1.Length]; Array.Copy(ch1, temp1, ch1.Length); } else if (m1 && m2) { temp1 = new char[ch1.Length - 1]; for (i = 0; i < temp1.Length; i++) temp1[i] = ch1[i + 1]; temp2 = new char[ch2.Length - 1]; for (i = 0; i < temp2.Length; i++) temp2[i] = ch2[i + 1]; } else if (!m1 && !m2) { temp1 = new char[ch1.Length]; temp2 = new char[ch2.Length]; Array.Copy(ch1, temp1, ch1.Length); Array.Copy(ch2, temp2, ch2.Length); } n = temp1.Length; m = temp2.Length; if (n > m) { ind = 0; r_size = 0; c1 = new int[n]; c1 = ToIntArray(temp1); c2 = new int[n]; result = new int[n + 1]; r_size = n - m; for (i = 0; i < r_size; i++) c2[i] = 0; ind = r_size; foreach (char c in str2) { c2[ind] = ToIntDigit(c); ind++; } size = n; } else if (n < m) { ind = 0; r_size = 0; c1 = new int[m]; c2 = new int[m]; c2 = ToIntArray(temp2); result = new int[m + 1]; r_size = m - n; for (i = 0; i < r_size; i++) c1[i] = 0; ind = r_size; foreach (char c in str1) { c1[ind] = ToIntDigit(c); ind++; } size = m; } else { c1 = new int[n]; c2 = new int[m]; result = new int[n + 1]; c1 = ToIntArray(temp1); c2 = ToIntArray(temp2); size = n; } Actions(result, c1, c2, m1, m2, size); } void Actions(int[] result, int[] c1, int[] c2, bool m1, bool m2, int size) { int[] n = new int[c1.Length]; Array.Copy(c1, n, c1.Length); int[] m = new int[c2.Length]; Array.Copy(c2, m, c2.Length); if (Equally(c1, c2, m1, m2)) { Console.Write("Результат : {0}", 0); } else if (!m1 && !m2 && Over(n, m, m1, m2)) { result = Subtract(n, m, size); ShowResult(result, res_sign); } else if (!m1 && !m2 && Over(m, n, m1, m2)) { result = Subtract(m, n, size); res_sign = '-'; ShowResult(result, res_sign); } else if (m1 && !m2 && !Over(n, m, m1, m2)) { result = Add(m, n, size); res_sign = '-'; ShowResult(result, res_sign); } else if (!m1 && m2 && Over(n, m, m1, m2)) { result = Add(n, m, size); res_sign = ' '; ShowResult(result, res_sign); } else if (m1 && m2 && !Over(n, m, m1, m2)) { result = Subtract(n, m, size); res_sign = ' '; ShowResult(result, res_sign); } else if (m1 && m2 && Over(n, m, m1, m2)) { result = Subtract(m, n, size); res_sign = '-'; ShowResult(result, res_sign); } Console.WriteLine("\nc1 != c2 - {0}", !Equally(c1, c2, m1, m2)); } int[] Subtract(int[] c1, int[] c2, int size) { int[] r = new int[size]; int st = 0; int res; for (int k = size - 1; k >= 0; k--) { c1[k] += st; if ((c1[k] - c2[k]) < 0) { res = 10 + (c1[k] - c2[k]); st = -1; } else { res = (c1[k] - c2[k]); st = 0; } r[k] = res; } return r; } int[] Add(int[] c1, int[] c2, int size) { int[] a = new int[size + 1]; int st = 0; int res; for (int k = size - 1; k >= 0; k--) { res = 0; c1[k] += st; if ((c1[k] + c2[k]) >= 10) { res = (c1[k] + c2[k]) - 10; st = 1; } else { res = (c1[k] + c2[k]); st = 0; } a[k + 1] = res; } a[0] += st; return a; } public void ShowResult(int[] r, char sign) { int ide = 0; Console.Write("Результат : {0}", sign); if (r[ide] == 0) ide = 1; else ide = 0; for (i = ide; i < r.Length; i++) Console.Write(r[i]); } static int[] ToIntArray(char[] s) { int[] test_tia = new int[s.Length]; for (int k = 0; k < test_tia.Length; k++) switch (s[k]) { case '0': test_tia[k] = 0; break; case '1': test_tia[k] = 1; break; case '2': test_tia[k] = 2; break; case '3': test_tia[k] = 3; break; case '4': test_tia[k] = 4; break; case '5': test_tia[k] = 5; break; case '6': test_tia[k] = 6; break; case '7': test_tia[k] = 7; break; case '8': test_tia[k] = 8; break; case '9': test_tia[k] = 9; break; default: break; } return test_tia; } static int ToIntDigit(char s) { int tid = 0; switch (s) { case '0': tid = 0; break; case '1': tid = 1; break; case '2': tid = 2; break; case '3': tid = 3; break; case '4': tid = 4; break; case '5': tid = 5; break; case '6': tid = 6; break; case '7': tid = 7; break; case '8': tid = 8; break; case '9': tid = 9; break; default: break; } return tid; } static char[] ToChar(string s) { int i = 0; char[] test = new char[s.Length]; foreach (char c in s) { test[i] = c; i++; } return test; } bool Over(int[] c1, int[] c2, bool m1, bool m2) { int q, k; q = c1.Length; k = c2.Length; if (m1 && !m2) return false; else if (m2 && !m1) return true; if (q > k && !m1) return true; if (q < k && !m2) return false; else if (q == k && (!m1 && !m2)) { for (int uq = 0; uq < q; uq++) if (c1[uq] > c2[uq]) return true; else return false; } else if (q == k && (m1 && m2)) { for (int iq = 0; iq < q; iq++) if (c1[iq] < c2[iq]) return true; else return false; } return false; } bool Equally(int[] c1, int[] c2, bool m1, bool m2) { if (m1 && !m2) return false; else if (m2 && !m1) return false; if (c1[0] != c2[0]) return false; if ((c1.Length > c2.Length) || (c1.Length < c2.Length)) return false; for (int i = 1; i < c1.Length; i++) if (c1[i] == c2[i]) continue; else return false; return true; } } class Program { static void Main(string[] args) { string str1 = String.Empty; string str2 = String.Empty; LongNumbers ln; Console.Write("Введiть 1 число : "); str1 = Console.ReadLine(); Console.Write("Введiть 2 число : "); str2 = Console.ReadLine(); ln = new LongNumbers(str1, str2); Console.ReadLine(); } } 5. Результати роботи програм / /
Антиботан аватар за замовчуванням

11.05.2016 16:09

Коментарі

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

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

Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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