Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Реализация вычитания на языке Pascal.




Const

DMAX = 100;

Type

thuge = array [0..DMAX] of integer;

 

procedure add(var a, b: thuge);

{функция прибавляет к числу a число b}

Var

i, r: integer;

{r - обозначает сколько у нас "в уме"}

Begin

if a[0] < b[0] then a[0]:= b[0];

{складывать нужно до размера большего числа}

r:= 0;

{при сложение младших цифр в уме у нас 0}

for i:= 1 to a[0] do

Begin

a[i]:= a[i] + b[i] + r;

{сумма очередных цифр и переноса}

if a[i] >= 10 then

{случай, когда происходит перенос в следующий разряд}

Begin

r:= 1;

dec(a[i], 10);

End else begin

{случай, когда переноса не происходит}

r:= 0;

end;

end;

{если после сложения остался еще перенос, то нужно добавить еще одну цифру}

If r > 0 then

Begin

inc(a[0]);

a[a[0]]:= r;

end;

end;

 

Реализация сложения на языке С++.

#define DMAX 100

typedef int thuge[DMAX];

void add(thuge &a, thuge &b){

//функция прибавляет к числу a число b

if (a[0] < b[0]) a[0] = b[0];

//складывать нужно до размера большего числа

int r = 0;

/*r - обозначает сколько у нас "в уме"

при сложение младших цифр в уме у нас 0*/

for (int i = 1; i <= a[0]; ++i) {

a[i] += b[i] + r;

//сумма очередных цифр и переноса

if (a[i] >= 10) {

//случай, когда происходит перенос в следующий разряд

r = 1;

a[i] -= 10;

} else {

//случай, когда переноса не происходит

r = 0;

}

}

//если после сложения остался еще перенос, то нужно добавить еще одну цифру

if (r > 0) {

a[0]++;

a[a[0]] = r;

}

}

 

Существуют разные системы счисления. В принципе мы можем работать в любой из них. Но нужно помнить, что перенос происходит, если сумма стала больше или равна основания системы счисления. Чтобы работать в системе счисления base, нужно заменить в программе все 10 на base. (В таком случае желательно завести константу base.) Для достижения максимальной скорости программы нужно выбирать основание системы исчисления равное некоторой степени двойки. При таком выборе можно реализовать более быстрые операции, связанные с base. Но в таком случае возникают некоторые трудности при вводе и выводе числа. Для ввода и вывода придется переводить число из одной системы счисления в другую. Это достаточно трудоемкая операция, поэтому для нас будут представлять интерес системы счисления с основанием 10K (для некоторого натурального числа K). Такая система счисления, фактически, означает, что в одной ячейке массива будет храниться не одна, а сразу K цифр. Очевидно, что операция сложения будет работать в K раз быстрее, так как в числах будет в K раз меньше цифр.

 

Вычитание в столбик практически аналогично. Если при вычитании двух цифр результат получается отрицательным, то мы занимаем единицу из старшего разряда. Мы будем работать только с неотрицательными числами, поэтому при вычитании будем подразумевать, что разность неотрицательна. В отличие от сложения количество цифр в разности может уменьшиться, поэтому нужно будет пересчитать количество цифр.

Реализация вычитания на языке Pascal.

procedure subtract(var a, b: thuge);

{функция вычитает из числа a число b}

Var

i, r: integer;

{r - обозначает, был ли заем единицы из текущего разряда}

begin

r:= 0;

{заем из младшего разряда отсутствует}

for i:= 1 to a[0] do

Begin

a[i]:= a[i] - b[i] - r;

{разность очередных цифр с учетом заема}

If a[i] < 0 then

{случай, когда происходит заем из следующего разряда}

Begin

r:= 1;

inc(a[i], base);

End else begin

{случай, когда заем не происходит}

r:= 0;

end;

end;

{Разность может содержать меньше цифр,

поэтому нужно при необходимости уменьшить количество цифр}

while (a[0] > 1) and (a[a[0]] = 0) do

Begin

dec(a[0]);

end;

end;

Реализация вычитания на языке С++.

void subtract(thuge &a, thuge &b) {

//функция вычитает из числа a число b

//r - обозначает был ли заем единицы из текущего разряда

int r = 0;

//заем из младшего разряда отсутствует

for (int i = 1; i <= a[0]; ++i) {

a[i] -= b[i] + r;

//разность очередных цифр с учетом заема

if (a[i] < 0) {

//случай, когда происходит заем из следующего разряда

r = 1;

a[i] += base;

} else {

//случай, когда заем не происходит

r = 0;

}

}

/*Разность может содержать меньше цифр,

поэтому нужно при необходимости уменьшить количество цифр*/

while (a[0] > 1 && a[a[0]] == 0) {

--a[0];

}

}

 

Сложение и вычитание работает за длину наибольшего числа. Числа, которые встречаются в процессе вычислений, не превосходят по модулю 2 * base. Значит в одной ячейке массива при использовании типа longint (int) можно хранить до 9 десятичных цифр (то есть основание системы исчисления может быть до 109).

Сравнение чисел

Первое на что мы обратим внимание, когда будем сравнивать числа, будет количество цифр в них. Если количество цифр различно, то больше то из них, которое содержит больше цифр. Если количество цифр одинаково, то нужно сравнивать, начиная со старшей цифры. При обнаружении первого различия (т. е. самая старшая цифра, в которой есть различие), можно определить какое из чисел больше. Если два числа не имеют различий, то они равны.

function compare(var a, b: thuge): integer;

{

a < b => -1

a > b => 1

a = b => 0

}

Var

i: integer;

Begin

{сравнение по количеству цифр}

If a[0] < b[0] then

Begin

compare:= -1;

exit;

end;

If a[0] > b[0] then

Begin

compare:= 1;

exit;

end;

{сравнение в случае одинакового количества цифр}

for i:= a[0] downto 1 do

Begin






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных