Long multiplication: Difference between revisions

add AWK
(→‎{{header|Tcl}}: Task really calls for manual multiplication, so do it...)
(add AWK)
Line 201:
===Other libraries or implementation specific extensions===
As of February 2009 no open source libraries to do this task have been located.
 
=={{Header|AWK}}==
{{works with|gawk|3.1.0}}
 
{{trans|Tcl}}
<lang awk>BEGIN {
DEBUG = 0
n = 2^64
nn = sprintf("%.0f", n)
printf "2^64 * 2^64 = %.0f\n", multiply(nn, nn)
printf "2^64 * 2^64 = %.0f\n", n*n
exit
}
 
function multiply(x, y) {
len_x = split_reverse(x, ax)
len_y = split_reverse(y, ay)
print_array(ax)
print_array(ay)
for (j=1; j<=len_y; j++) {
m = ay[j]
c = 0
i = j - 1
for (k=1; k<=len_x; k++) {
d = ax[k]
i++
v = res[i]
if (v == "") {
append_array(res, 0)
v = 0
}
mul = v + c + d*m
c = int(mul / 10)
v = mul % 10
res[i] = v
}
append_array(res, c)
}
print_array(res)
result = reverse_join(res)
sub(/^0+/, "", result)
return result
}
 
function split_reverse(x, a) {
split(x, a_x, //)
return reverse_array(a_x, a)
}
 
function reverse_array(a,b) {
len = length_array(a)
for (i in a) {
b[1+len-i] = a[i]
}
return len
}
 
# work around a bug in gawk 3.1.6 where length(array) doesn't work
# if the array is a function parameter
function length_array(a) {
len = asort(a, x)
return len
}
 
function append_array(a, value) {
len = length_array(a)
a[++len] = value
}
 
function reverse_join(a) {
len = length_array(a)
str = ""
for (i=len; i>=1; i--) {
str = str a[i]
}
return str
}
 
function print_array(a) {
if (DEBUG) {
len = length_array(a)
print "length=" len
for (i=1; i<=len; i++) {
printf("%s ", i%10)
}
print ""
for (i=1; i<=len; i++) {
#print i " " a[i]
printf("%s ", a[i])
}
print ""
print "===="
}
}</lang>
outputs:
<pre>2^64 * 2^64 = 340282366920938463463374607431768211456
2^64 * 2^64 = 340282366920938463463374607431768211456</pre>
 
=={{Header|C}}==
Anonymous user