Long multiplication: Difference between revisions
Content added Content deleted
m (→{{header|J}}) |
imported>Thebeez (Added uBasic/4tH version) |
||
Line 7,686: | Line 7,686: | ||
340282366920938463463374607431768211456 |
340282366920938463463374607431768211456 |
||
340282366920938463463374607431768211456</pre> |
340282366920938463463374607431768211456</pre> |
||
=={{header|uBasic/4tH}}== |
|||
{{Trans|Liberty BASIC}} |
|||
<syntaxhighlight lang="basic">' now, count 2^64 |
|||
Print "2^64" |
|||
a := "1" |
|||
For i = 1 To 64 |
|||
a = FUNC(_multByD (a, 2)) |
|||
Next |
|||
Print Show (a) |
|||
Print "(check with known value)" |
|||
Print "18446744073709551616" |
|||
Print "(looks OK)" |
|||
' now let's do b*a stuff |
|||
Print |
|||
Print "2^64*2^64" |
|||
Print Show (FUNC (_longMult (a, a))) |
|||
Print "(check with known value)" |
|||
Print "340282366920938463463374607431768211456" |
|||
Print "(looks OK)" |
|||
End |
|||
' --------------------------------------- |
|||
_longMult |
|||
Param (2) |
|||
Local (7) |
|||
c@ = 1 |
|||
If Peek (a@, 0) = Ord ("-") Then a@ = Chop (a@, 1) : c@ = -1 |
|||
d@ = 1 |
|||
If Peek (b@, 0) = Ord ("-") Then b@ = Chop (b@, 1) : d@ = -1 |
|||
e@ := "" |
|||
f@ := "" |
|||
g@ := "" |
|||
For h@ = Len(a@)-1 To 0 Step -1 |
|||
i@ = Peek (a@, h@) - Ord ("0") |
|||
f@ = FUNC(_multByD (b@, i@)) |
|||
e@ = FUNC(_addLong (e@, Join (f@, g@))) |
|||
g@ = Join (g@, "0") |
|||
Next ' print i@, f@, e@ |
|||
' print e@ |
|||
If c@*d@ < 0 Then e@ = Join ("-", e@) |
|||
Return (e@) |
|||
_multByD |
|||
Param (2) ' multiply a@ by digit b@ |
|||
Local (5) |
|||
c@ := "" |
|||
d@ = 0 |
|||
For e@ = Len (a@)-1 To 0 Step -1 |
|||
f@ = Peek (a@, e@) - Ord ("0") |
|||
g@ = f@*b@ + d@ |
|||
d@ = g@ / 10) |
|||
g@ = g@ % 10 |
|||
' print f@, g@ |
|||
c@ = Join (Str (g@), c@) |
|||
Next |
|||
If d@ > 0 Then c@ = Join (Str (d@), c@) |
|||
Return (c@) ' print c@ |
|||
_addLong ' add a@ + b@, for now only positive |
|||
Param (2) |
|||
Local (7) |
|||
c@ = Max (Len(a@), Len(b@)) |
|||
a@ = FUNC(_Pad (a@, c@)) |
|||
b@ = FUNC(_Pad (b@, c@)) |
|||
d@ := "" ' result |
|||
e@ = 0 |
|||
For f@ = c@-1 To 0 Step -1 |
|||
g@ = Peek (a@, f@) - Ord ("0") |
|||
h@ = Peek (b@, f@) - Ord ("0") |
|||
i@ = g@ + h@ + e@ |
|||
e@ = i@ / 10 |
|||
i@ = i@ % 10 |
|||
' print g@, h@, i@ |
|||
d@ = Join (Str (i@), d@) |
|||
Next |
|||
' print d@ |
|||
If e@ > 0 Then d@ = Join (Str (e@), d@) |
|||
Return (d@) |
|||
_Pad ' pad from right with 0 to length n |
|||
Param (2) |
|||
Do While Len (a@) < b@ |
|||
a@ = Join("0", a@) |
|||
Loop |
|||
Return (a@)</syntaxhighlight> |
|||
{{Out}} |
|||
<pre>2^64 |
|||
18446744073709551616 |
|||
(check with known value) |
|||
18446744073709551616 |
|||
(looks OK) |
|||
2^64*2^64 |
|||
340282366920938463463374607431768211456 |
|||
(check with known value) |
|||
340282366920938463463374607431768211456 |
|||
(looks OK) |
|||
0 OK, 0:478</pre> |
|||
=={{header|UNIX Shell}}== |
=={{header|UNIX Shell}}== |