Ethiopian multiplication: Difference between revisions

Content added Content deleted
m (→‎{{header|REXX}}: added/changed comments, added subroutine fence, added whitespace. -- ~~~~)
Line 2,668: Line 2,668:


=={{header|REXX}}==
=={{header|REXX}}==
<lang rexx>/*REXX program multiplies 2 integers by Ethiopian/Russian peasant method*/
<lang rexx>
numeric digits 1000 /*handle very large integers. */
/*REXX program multiplies 2 integers by Ethiopian/Russian peasant method*/
numeric digits 1000 /*handle extremely large integers. */
parse arg a b . /*handles zeroes & negative ints.*/
parse arg a b . /*handles zeroes and negative integers.*/
/*A & B should be checked if ints*/
/*A & B should be checked if integers.*/
say 'a=' a
say 'a=' a
say 'b=' b
say 'b=' b
say 'product=' emult(a,b)
say 'product=' emult(a,b)
exit /*stick a fork in it, we're done.*/
exit
/*──────────────────────────────────EMULT subroutine────────────────────*/

emult: procedure; parse arg x 1 ox,y
emult: procedure; parse arg x 1 ox,y
prod=0
prod=0
do while x\==0
do while x\==0
if \iseven(x) then prod=prod+y
if \iseven(x) then prod=prod+y
x=halve(x)
x=halve(x)
y=double(y)
y=double(y)
end
end
return prod*sign(ox)
return prod*sign(ox)
/*──────────────────────────────────subroutines─────────────────────────*/

halve: return arg(1)%2
halve: return arg(1)%2
double: return arg(1)*2
double: return arg(1)*2
Line 2,698: Line 2,697:
halve: procedure; parse arg ?; return ?%2
halve: procedure; parse arg ?; return ?%2
double: procedure; parse arg x; return x+x
double: procedure; parse arg x; return x+x
iseven: procedure; parse arg _; return _//2 == 0
iseven: procedure; parse arg _; return _//2 == 0</lang>
</lang>


=={{header|Ruby}}==
=={{header|Ruby}}==