28 lines
653 B
Tcl
28 lines
653 B
Tcl
package require Tcl 8.5
|
|
|
|
proc longmult {x y} {
|
|
set digits [lreverse [split $x ""]]
|
|
set result {0}
|
|
set j -2
|
|
foreach m [lreverse [split $y ""]] {
|
|
set c 0
|
|
set i [incr j]
|
|
foreach d $digits {
|
|
set v [lindex $result [incr i]]
|
|
if {$v eq ""} {
|
|
lappend result 0
|
|
set v 0
|
|
}
|
|
regexp (.)(.)$ 0[expr {$v + $c + $d*$m}] -> c v
|
|
lset result $i $v
|
|
}
|
|
lappend result $c
|
|
}
|
|
# Reconvert digit list into a decimal number
|
|
set result [string trimleft [join [lreverse $result] ""] 0]
|
|
if {$result == ""} then {return 0} else {return $result}
|
|
}
|
|
|
|
puts [set n [expr {2**64}]]
|
|
puts [longmult $n $n]
|
|
puts [expr {$n * $n}]
|