Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра «Захисту інформації»
Звіт
Про виконання лабораторної роботи #2
На тему:
“ ДОСЛІДЖЕННЯ ШВИДКОДІЇ ВИКОНАННЯ МУЛЬТИПЛІКАТИВНИХ ОПЕРАЦІЙ З ДОВГИМИ ЧИСЛАМИ ”
Львів-2009
Мета роботи.
Вивчити способи представлення та алгоритми для виконання операцій введення-виведення, порівняння, підсумовування, віднімання довгих чисел та навчитися розробляти програмне забезпечення для реалізації перерахованих алгоритмів на комп’ютері.
Завдання.
Номер з/п
Варіант представлення числа
Заповнення невикористаних розрядів
Операції з довгими числами
2
2
-1
Віднімання, менше
Мультиплікативна операція: швидке множення
Виконання роботи.
Текст програми
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 50
#define OSN 10000
void InputNum(const char *str, long a[MAX_LEN])
{
int j,i=strlen(str); long ln;
char *tmp=(char*)malloc(i>>3<<2+8);
strcpy(tmp, str); j=0;
do
{
tmp[i]=0; i-=4; if(i<0) i=0;
sscanf(&tmp[i], "%d", &ln), a[MAX_LEN - ++j]=ln;
} while (i);
while (j<MAX_LEN) a[MAX_LEN - ++j]=-1;
free(tmp);
}
void OutputNum(long a[MAX_LEN])
{
int i,fn=0;
while (fn<MAX_LEN && a[fn]==-1) fn++;
if(fn==MAX_LEN) return;
for (i=fn;i<MAX_LEN; i++)
printf((i==fn) ? "%d" : "%04d", a[i]);
}
int Less(long a[MAX_LEN], long b[MAX_LEN])
{
int i=-1;
while (++i<MAX_LEN)
if (a[i]==b[i]) continue;
else return a[i]<b[i] ? 1 : -1;
return 0;
}
int SubNum(long ta[MAX_LEN], long tb[MAX_LEN], long c[MAX_LEN])
{
long *a, *b, tmp; int j,i,to=MAX_LEN-1,minus=0;
if (Less(ta,tb)==1) a=tb, b=ta, minus=1; else a=ta, b=tb;
for (i=0;i<MAX_LEN;i++) c[i]=a[i];
for (i=MAX_LEN-1; ; i--)
{
if (b[i]==-1) break;
tmp=c[i]-b[i];
if(tmp<0)
{
tmp+=OSN, j=i;
while (c[j-1]-1<0 && j>0) c[j-1]+=-1+OSN, j--;
c[j-1]--;
}
c[i]=tmp;
}
i=0; while (c[i]<=0 && i<MAX_LEN-1) c[i++]=-1;
return minus;
}
int main()
{
char *szA=(char*)malloc(500);
char *szB=(char*)malloc(500);
int g;
long a[MAX_LEN], b[MAX_LEN], c[MAX_LEN];
printf("a = "), scanf("%s", szA), printf("b = "), scanf("%s", szB);
InputNum(szA,a), InputNum(szB,b);
g=SubNum(a,b,c);
printf("a - b = "); if(g) printf("-"); OutputNum(c);
printf("\n"); free(szA), free(szB);
return 0;
}
Результат виконання.
66555221236121
12312464143123
a-b=54242757092998
Блок-схеми підпрограм та функцій.
А) Блок-схема алгоритму введення довгого числа.
Б) Алгоритм виведення довгого числа.
В) Блок-схеми алгоритмів порівняння довгих чисел.
В) Блок-схема алгоритму швидкого множення двох довгих чисел.
Список ідентифікаторів констант, змінних, процедур і функцій, використаних у блок-схемах алгоритмів і програм, та їх пояснення.
МахLen
Максимальна довжина матриці
Osn
Основа ділення
InputNum
Функція введення довгого числа
OutputNum
Функція виведення довгого числа
Less
Функція порівняння «менше»
SubNum
Функція віднімання 2х довгих чисел
Main
Основна функція
Tmp
Змінна для тимчасового зберігання даних
I,J
Рахівники
A[MaxLen]
Матриця, заповнюєма довгими числами
Fn
Значення даного елементу масиву
Minus
Значення, яке повертає функція SubNum, - є результатом віднімання двох довгих чисел
szA
Розмір пам’яті для А
szB
Розмір пам’яті для В
Висновок:
На цій л.р. я досліджував методи множення довгих чисел та їхню швидкодію. Також було виявлено, що метод «ШВИДКОГО МНОЖЕННЯ» є дійсно швидким.