Ethiopian multiplication: Difference between revisions
Content added Content deleted
(→{{header|UNIX Shell}}: Add {{works with|pdksh}} to the 2nd example. I used OpenBSD /bin/ksh.) |
m (→{{header|REXX}}: added the REXX language.) |
||
Line 2,039: | Line 2,039: | ||
print(ethiopicmult(17, 34, TRUE))</lang> |
print(ethiopicmult(17, 34, TRUE))</lang> |
||
=={{header|REXX}}== |
|||
<lang rexx> |
|||
/*REXX program multiplies 2 integers by Ethiopian/Russian peasant method*/ |
|||
numeric digits 1000 /*handle extremely large integers. */ |
|||
parse arg a b . /*handles zeroes and negative integers.*/ |
|||
/*A & B should be checked if integers.*/ |
|||
say 'a=' a |
|||
say 'b=' b |
|||
say 'product=' emult(a,b) |
|||
exit |
|||
emult: procedure; parse arg x 1 ox,y |
|||
prod=0 |
|||
do while x\==0 |
|||
if \iseven(x) then prod=prod+y |
|||
x=halve(x) |
|||
y=double(y) |
|||
end |
|||
return prod*sign(ox) |
|||
halve: return arg(1)%2 |
|||
double: return arg(1)*2 |
|||
iseven: return arg(1)//2==0 |
|||
/*Note: the above procedures don't modify (or define) any */ |
|||
/*local variables, so there is no need to specify PROCEDURE */ |
|||
/*REXX allows multiple definitions, only the 1st one is used. */ |
|||
/*Three different argument names (methodologies?) are shown. */ |
|||
halve: procedure; parse arg ?; return ?%2 |
|||
double: procedure; parse arg x; return x+x |
|||
iseven: procedure; parse arg _; return _//2 == 0 |
|||
</lang> |
|||
=={{header|Ruby}}== |
=={{header|Ruby}}== |