Jump to content

Long multiplication: Difference between revisions

→‎{{header|Arturo}}: Fixed it with an actual long multiplication program.
(→‎{{header|ATS}}: Code simplification and slight commentary revision.)
(→‎{{header|Arturo}}: Fixed it with an actual long multiplication program.)
Line 992:
 
=={{header|Arturo}}==
{{trans|ATS}}
{{Incorrect|Arturo|Task is "Implement long multiplication" not "Multiply two numbers using native operators"}}
 
<syntaxhighlight lang="rebol">print 2^64 * 2</syntaxhighlight>
The program is written to operate on strings containing digits and spaces.
 
<syntaxhighlight lang="arturo">
; The following two functions assume the 7-bit encoding is ASCII.
char2BCD: function [c] [
return (and (to :integer c) 15) % 10
]
BCD2char: function [i] [
return (to :char (or i 48))
]
 
multiplyBCD: function [u v] [
m: size u
n: size v
w: array.of: (m + n) `0`
 
predm: m - 1
predn: n - 1
predszw: (size w) - 1
 
; Long multiplication. See Algorithm 4.3.1M in Volume 2 of Knuth,
; ‘The Art of Computer Programming’. Here b = 10. Only the less
; significant nibble of a character is considered. Thus zero can be
; represented by either `0` or ` `, and other digits by their
; respective ASCII characters.
loop 0..predn 'j [
vj: char2BCD v\[predn - j]
if? vj = 0 [
set w (predn - j) `0`
] else [
carry: 0
loop 0..predm 'i [
ui: char2BCD u\[predm - i]
wij: char2BCD w\[predszw - (i + j)]
t: (ui * vj) + wij + carry
[carry digit]: divmod t 10
set w (predszw - (i + j)) (BCD2char digit)
]
set w (predn - j) (BCD2char carry)
]
]
 
return join w
]
 
twoRaised64: "18446744073709551616"
twoRaised128: multiplyBCD twoRaised64 twoRaised64
 
print twoRaised128
</syntaxhighlight>
 
{{out}}
 
<pre>3402823669209384634633746074317682114560340282366920938463463374607431768211456</pre>
 
=={{header|ATS}}==
1,448

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.