DEV Community

Keff
Keff

Posted on

[Challenge] Multiply 2 numbers without '+-*/' operators and 'for' and 'while' keywords

Following on the previous challenge, I thought of doing a similar challenge but for multiplication.

Can you multiply 2 numbers without using the following operators and keywords?

Rules:

  • Multiply a and b
  • Don't use operators: +-*/
  • Don't use keywords: for/while

Pseudocode:

a = 2 b = 32 multiply(a, b) => 64 
Enter fullscreen mode Exit fullscreen mode

Test:

multiply(a, b) == a * b 
Enter fullscreen mode Exit fullscreen mode

You can use any language you want, additionally you can add a note indicating which language it is, so people not familiar with the language can know!

That's all, have fun!!

My solution:

Top comments (8)

Collapse
 
mellen profile image
Matt Ellen-Tsivintzeli • Edited

Nice! My version only works for positive integers. I'm not sure how to do it for floating point:

 function plultimy(a, b) { let p1 = '1'.repeat(a); let p2 = p1.repeat(b); return p2.length; } 
Enter fullscreen mode Exit fullscreen mode
Collapse
 
mellen profile image
Matt Ellen-Tsivintzeli • Edited

OK, this seems very silly, but worth a try. I think this works for floating point numbers:

 function plultimy(a, b) { let negative = false; if(a < 0) { negative = true; a = Math.abs(a); } if(b < 0) { negative = true && !negative; b = Math.abs(b); } let astr = a.toString(10); let adec = 0; if(astr.indexOf('.') > ''.indexOf('l')) { adec = astr.split('.')[1].length; } a = parseInt(astr.replace('.', ''), 10); let bstr = b.toString(10); let bdec = 0; if(bstr.indexOf('.') > ''.indexOf('l')) { bdec = bstr.split('.')[1].length; } b = parseInt(bstr.replace('.', ''), 10); let p1 = '1'.repeat(a); let p2 = p1.repeat(b); let predot = p2.length.toString(); let withdot = predot; let fulldec = '1'.repeat(adec).concat('1'.repeat(bdec)).length if(fulldec > 0) { if(predot.length < fulldec) { let diff = '1'.repeat(fulldec).slice(predot.length).length; predot = '0'.repeat(diff).concat(predot); } withdot = predot.slice(0, predot.slice(fulldec).length).concat('.').concat(predot.slice(predot.slice(fulldec).length)); } let result = (negative ? String.fromCodePoint(45) : '').concat(withdot); return result; } 
Enter fullscreen mode Exit fullscreen mode
Collapse
 
nombrekeff profile image
Keff

Wow, how ugly xD I love it!!!! This is why I love putting this quirky little challenges out there!!

Collapse
 
nombrekeff profile image
Keff

Nice solution, did not think of this one!!!! I also don't know how to make this solution work with floating points, seems nontrivial...

Collapse
 
devdufutur profile image
Rudy Nappée • Edited

One liner 😉

const multiply = (a, b) => new Array(a).fill(0).flatMap(_ => new Array(b).fill(0)).length 
Enter fullscreen mode Exit fullscreen mode
Collapse
 
nombrekeff profile image
Keff

Nice solution, this one wont work for floating point numbers right?

Collapse
 
devdufutur profile image
Rudy Nappée • Edited

Sure, and it would be better not trying multiply(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER) :D

Collapse
 
jonrandy profile image
Jon Randy 🎖️

Basically a repost of my dangerous add 😋

const multiply = (a,b)=>eval(`${a}${String.fromCharCode(42)}${b}`) 
Enter fullscreen mode Exit fullscreen mode