ISSN 2305-5626. Вестник МГТУ им. Н.Э. Баумана: электронное издание. 2013
9
//
cout << "n1 = " << n1 << " n2 = " << n2 << endl;
z = ( n1 + n2 ) >> 1; // z=(n1+n2)/2 середина интервала
//
cout << "z = " << z << endl;
int nc = SingleMultiply( c, v, nv, z ); // c = v * z
//
cout << "c = v * z = "; ByteBitPrint( c, nc );
if( nc > nv ) // c > v * z
{ n2 = z - 1; // продолжить поиск слева
continue;
}
int ns1 = SingleSubtract( s, u, c, nc );//s = u - v * z
if( s[ns1-1] == 45 ) // знак '-', z слишком большое
{ n2 = z - 1; // продолжить поиск слева
continue;
}
int ns2 = SingleSubtract( c, s, v, nc ); // c = s - v
if( c[ns2-1] == 45 ) break; // знак '-', найдено z * v
n1 = z + 1; // z мало, продолжить поиск справа
}
// cout << "End DichMult" << endl;
return z;
}
В программе
HI04
, представленной ниже, выполняется дихото-
мический поиск одноразрядного множителя
dm
для введенных чисел
a
и
b
одинаковой длины. Функция
DichMult
( ) находится в подключа-
емом файле
#include "DichMult.h"
:
// Program HI04 (Win32)
// Выровненный одноразрядный дихотомический множитель
// для байтовых целых чисел
#include <conio.h> // _getch
#include <iostream>
using namespace std;
#include "InputAB.h"
#include "SingleMultiply.h"
#include "SingleSubtract.h"
#include "DichMult.h"
void main(void)
{ char sa[256]; // символьный буфер целого числа a
unsigned char a[256]; // байтовый массив целого числа
a
char sb[256]; // символьный буфер целого числа b
unsigned char b[256]; // байтовый массив целого числа
b
InputAB( sa, a, sb, b ); // ввод чисел a и b
int nb = strlen( sb ); // байтовая длина числа b
// Выровненный одноразрядный дихотомический поиск
unsigned char c[256]; // для промежуточных вычислений
unsigned char s[256]; // для результата вычитания
int dm = DichMult( a, b, nb-1, c, s ); // b * dm
cout << "dm = " << dm << endl;
cout << "s = a - b * dm = "; ByteBitPrint( s, nb-1);
_getch(); // просмотр результата
}
Если при запуске программы
HI04
ввести числа
41
a
=
и
12
b
=
и
прокомментировать отладочные распечатки в функции
DichMult
( ),
1,2,3,4,5,6,7,8 10,11,12,13,14,15,16,17,18