Здравствуйте, товарищи))))
Предложите, кто может, свои варианты решения: как написать программу, выполняющую умножение двух чисел (для вещественного и целочисленного типов), используя при этом:
1. Оператор сложения.
2. Оператор вычитания.
3. Оператор присваивания.
4. Условный оператор и оператор goto.
Заранее спасибо.
ЗЫ. прилагаю свой вариант:
одна программа и для целых, и для вещественных? или две разные?
две разные
Для целочисленных:
function mul (a,b:longint):longint;
var z,k:byte;
r:longint;
begin
z:=byte(a<0) xor byte (b<0);
a:=abs(a); b:=abs (B);
k:=0; r:=0;
while b>0 do begin
if (b and 1)=1 then r:=r+a shl k;
inc (k); b:=b shr 1;
end;
if z=1 then r:=-r;
mul:=r;
end;
циклы нельзя... судя по условию
function mul (a,b:longint):longint;
var z,k:byte;
r:longint;
begin
z:=byte(a<0) xor byte (b<0);
a:=abs(a); b:=abs (B);
k:=0; r:=0;
while b>0 do begin
if (b and 1)=1 then r:=r+a shl k;
inc (k); b:=b shr 1;
end;
if z=1 then r:=-r;
mul:=r;
end;
function mul (a,b:longint):longint;
var z,k:byte;
r:longint;
label 1,2;
begin
z:=byte(a<0) xor byte (b<0);
a:=abs(a); b:=abs (B);
k:=0; r:=0;
1: if b=0 then goto 2;
if (b and 1)=1 then r:=r+a shl k;
inc (k); b:=b shr 1;
goto 1;
2: if z=1 then r:=-r;
mul:=r;
end;
а shl и xor ты через что испортишь?
function mul (a,b:longint):longint;
var r:longint;
label 1,2;
begin
r:=0;
1: if b=0 then goto 2;
if b<0 then
begin r:=r-a; b:=b+1; end
else
begin r:=r+a; b:=b-1; end;
goto 1;
2: mul:=r;
end;
Кто что придумал с вещественными ? У меня только с погрешностью вышло, а как точно, что-то не соображу..
Без погрешности-то и встроенное умножение не умеет
Можно циклом выделять все цифры; сначала бинарным поиском узнать порядок каждого из чисел, а потом вычитать постепенно и перемножать всё друг на друга (все разряды первого на все разряды второго)
Хотя нет, с бинарным поиском я погорячился. Обычным циклом (т.е. вычисляем руками десятичный логарифм)
function mul2(a,b:real):real;
var r:real;
z,s:real;
a1,a2:real;
k:byte;
label 1,2,6,7;
begin
{writeln (a*b:0:3);}
a1:=0; a2:=0; k:=0; s:=0; z:=0;
if a<0 then begin z:=1-z; a:=-a; end;
if b<0 then begin z:=1-z; b:=-b; end;
1: if a<1 then goto 2;
a:=a-1; a1:=a1+1;
goto 1;
2: a2:=a;
6: if a1<=0 then goto 7;
s:=s+b; a1:=a1-1;
goto 6;
7: a:=b; b:=a2;
k:=k+1; if k=1 then goto 1;
if z=1 then s:=-s;
mul2:=s;
end;
Дальше нет смысла обсуждать, пока ОП не укажет границы входных (действительных) чисел и требуемую точность ответа. Еще вопрос: можно ли использовать массивы?