Long multiplication: Difference between revisions

Content added Content deleted
m (→‎{{header|Sidef}}: added output)
(added Ceylon)
Line 1,609: Line 1,609:
340282366920938463463374607431768211456
340282366920938463463374607431768211456
</pre>
</pre>


=={{Header|Ceylon}}==
<lang Ceylon>"run() is the main function of this module."

shared void run() {

function multiply(String|Integer|Integer[] top, String|Integer|Integer[] bottom, Integer base = 10) {

function fromString(String s) =>
s
.filter(not(','.equals))
.map((char) => Integer.parse(char.string))
.narrow<Integer>()
.sequence()
.reversed;

function toString(Integer[] ints) =>
""
.join(ints.interpose(',', 3).sequence().reversed)
.removeInitial("0")
.removeInitial(",");

function fromInteger(Integer int) => fromString(int.string);

function convertArg(String|Integer|Integer[] arg) =>
switch(arg)
case (is String) fromString(arg)
case (is Integer) fromInteger(arg)
case (is Integer[]) arg;

value a = convertArg(top);
value b = convertArg(bottom);

value p = a.size;
value q = b.size;
value product = Array.ofSize(p + q, 0);

for (bIndex->bDigit in b.indexed) {
variable value carry = 0;
for (aIndex->aDigit in a.indexed) {
assert (exists prodDigit = product[aIndex + bIndex]);
value temp = prodDigit + carry + aDigit * bDigit;
carry = temp / base;
product[aIndex + bIndex] = temp % base;
}
assert (exists lastDigit = product[bIndex + p]);
product[bIndex + p] = lastDigit + carry;
}

return toString(product.sequence());
}

value twoToThe64th = "18,446,744,073,709,551,616";
value expectedResult = "340,282,366,920,938,463,463,374,607,431,768,211,456";
value result = multiply(twoToThe64th, twoToThe64th);

print("The expected result is ``expectedResult`` and the real result was ``result``");
print("Do the match? ``expectedResult == result then "Yes!" else "No!"``");
}</lang>


=={{Header|COBOL}}==
=={{Header|COBOL}}==