2017-09-25 7 views
3

J'essaie de trouver des moyens d'obtenir les produits de deux entiers sans utiliser * dans ma solution. Le plus proche que j'ai eu étaitComment obtenir le produit de deux entiers sans utiliser *

/*Example: 2,5 output ====> 10 */ 
/*Example: 10,5 output ====> 50 */ 

const productOfTwoInt = (int,int2) => { 
    var data1 = 0; 
    var data2 = 0; 

    var result; 
    var result2; 

    for(var x = 0; x <= int; x++) { 
     result = x += data1 
     console.log(result) 
    } 

    for(var j = 0; j <= int2; j++) { 
     result2 = j += data2 
    } 

    return result + result2  
} 

console.log(productOfTwoInt(3,5)) 
+0

'for (var i = 0; je shmosel

Répondre

1

Votre solution semble déjà assez bonne. Cela peut être un peu simplifié à:

function multiply(a,b){ 
 
    //just one minus, lets swap 
 
    if(a<0 && b>0) [a,b] = [b,a]; 
 
    //two minuses: let them be positive 
 
    if(a<0 && b<0) (a = Math.abs(a), b = Math.abs(b)); 
 
    var result = 0; 
 
    while(a--){ 
 
    result += b; 
 
    } 
 
    return result; 
 
} 
 

 
console.log(
 
    multiply(1,2), 
 
    multiply(3,4), 
 
    multiply(6,7), 
 
    multiply(-1,-2), 
 
    multiply(1,-2) 
 
);

+2

Si' a' est négatif, vous obtiendrez une boucle infinie. – Amy

+0

@amy jup fixe ... –

1

Vous pouvez faire

const productOfTwoInt = (x, y) => { 
 
    let z = Math.log(x) + Math.log(y); 
 
    return Math.round(Math.exp(z)); 
 
} 
 

 
console.log(productOfTwoInt(3,5))

+0

Intelligent, mais ne fonctionnera que pour les entiers positifs. Essayez 'productOfTwoInt (-2, 5)'. – dfsq

0

Comme suggéré par Nina Scholz de answer, la "russe Multiplication":

const productOfTwoInt = (a, b) => { 
 

 
    var a0 = a; 
 
    var result = 0; 
 

 
    while (1) { 
 
     if (a0 % 2 !== 0) 
 
      result += b; 
 
      
 
     if (a0 == 1 || a0 == -1) break; 
 
     
 
     a0 = Math.floor(a0/2); 
 
     b *= 2; 
 
    } 
 
\t \t return a > 0 ? result : -result; 
 
} 
 

 
console.log(
 
    productOfTwoInt(4, 5), 
 
    productOfTwoInt(4, -5), 
 
    productOfTwoInt(-40, 5), 
 
    productOfTwoInt(-4, -50) 
 
);

solution traditionnelle:

const productOfTwoInt = (int, int2) => { 
 
     
 
     let result = 0; 
 
     let isPositive = int > 0; 
 
     let i = 0; 
 
    
 
    
 
     while (i != int) { 
 
      result += int2; 
 
      if (isPositive) 
 
       i++; 
 
      else 
 
       i--; 
 
     } 
 
    
 
\t return isPositive ? result : -result; 
 
    
 
    } 
 
    
 
    console.log(
 
     productOfTwoInt(4, 5), 
 
     productOfTwoInt(4, -5), 
 
     productOfTwoInt(-4, 5), 
 
     productOfTwoInt(-4, -5) 
 
    );

7

Vous pouvez prendre un certain décalage de bits, connu sous le nom ancient egyptian multiplication ou russian multiplication.

a  b  p comment 
---- ---- ---- ---------------------------------- 
    6  8  0 skip, because a is even 
    3 16 16 add 16 to p, because a is odd 
    1 32 48 add 32 to p, because a is odd 
    0 64 48 stop iteration, because a is zero 

function product(a, b) { 
 
    var p = 0; 
 
    while (a) { 
 
     p += (a & 1) && b; 
 
     a >>= 1; 
 
     b <<= 1; 
 
    } 
 
    return p; 
 
} 
 

 
console.log(product(6, 8)); // 48

+0

nice one;) qu'en est-il des nombres négatifs? –

+0

@Jonasw, vous pouvez stocker le signe et l'appliquer plus tard. –

0

Vous pouvez utiliser le faire de cette façon

Option 1

function mul(m,n){ 
    // make it more efficient 
    if(m<n) 
    { 
     var temp =m; 
     m=n; 
     n=temp; 
    } 
var v=0; 
if(n==1) 
     return m; 
v = mul(m,n>>1); 
v = v+v; 
if(n&1) 
     v+= m; 
return v; 
} 

console.log(mul(-2,5)); 

Working Example

2

Vous pouvez le faire avec inverse comme ceci:

function multiply(a, b) { 
    return a/(1/b) 
} 

multiply(2, 5) // 10 
multiply(10, 5) // 50